我DISTINCTly讨厌MySQL(帮助构建查询)

时间:2010-04-21 01:16:46

标签: sql mysql select distinct

我相信这是明确的前进:

我有一张包含30,000行的表格。当我SELECT DISTINCT 'location' FROM myTable时,它返回21,000行,大约是我期望的,但它只返回那一列。

我想要的是将它们移动到一个新表,但每个匹配的整行。

我最好的猜测类似于SELECT * from (SELECT DISTINCT 'location' FROM myTable)或类似的东西,但它说我有一个模糊的语法错误。

有没有一种方法可以抓住每个DISTINCT行的其余部分并一次性将其移动到新表中?

4 个答案:

答案 0 :(得分:8)

SELECT * FROM myTable GROUP BY `location`

或者如果你想转移到另一张桌子

CREATE TABLE foo AS SELECT * FROM myTable GROUP BY `location`

答案 1 :(得分:2)

区别表示返回的整行。所以你可以简单地使用

SELECT DISTINCT * FROM myTable GROUP BY 'location'

在单个列上使用Distinct没有多大意义。假设我有以下简单的设置

-id-   -location-
1       store
2       store
3       home

如果有某种查询返回所有列,但只是在位置上不同,将返回哪一行? 1还是2?它应该随机挑一个吗?因此,DISTINCT适用于返回的结果集中的所有列。

答案 2 :(得分:1)

嗯,首先你要确定你真正想要的东西。

问题在于,对于表中的某些位置值,即使位置值相同,其他列中也会有不同的值:

 Location     OtherCol   StillOtherCol

 Place1       1          Fred
 Place1       89         Fred
 Place1       1          Joe

在这种情况下,您要选择三行中的哪一行?当您谈到DISTINCT位置时,您将这三行不同的数据压缩成一行,将原始行从原始表中移动到新表中没有意义,因为DISTINCT结果中不再存在这些原始行组。 (如果给定位置的所有其他列始终相同,则问题更容易:只需从YourTable中选择DISTINCT *。)

如果您不关心来自其他列的值,您可以使用(错误的,恕我直言)MySQL扩展到SQL并执行:

SELECT * FROM YourTable GROUP BY Location

将为每个位置提供一行的结果集,以及以未定义的方式从原始数据派生的其他列的值。

答案 3 :(得分:0)

所有列中具有相同值的多行没有任何意义。好的 - 问题可能是纠正这种情况的一种方法。

考虑此表,id为PK:

kram=# select * from foba;
 id | no |     name      
----+----+---------------
  2 |  1 | a
  3 |  1 | b
  4 |  2 | c
  5 |  2 | a,b,c,d,e,f,g

您可以通过对该列进行分组,并选择具有最小PK的行(例如)来提取每个no(:= location)的样本:

SELECT * FROM foba WHERE id IN (SELECT  min (id) FROM foba GROUP BY no); 
 id | no | name 
----+----+------
  2 |  1 | a
  4 |  2 | c
相关问题