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

我非常讨厌MySQL(帮助构建查询),sql,mysql,select,distinct,Sql,Mysql,Select,Distinct,我相信这是正确的: 我有一张30000行的桌子。当我从myTable中选择DISTINCT“location”时,它返回21000行,这与我预期的差不多,但它只返回那一列 我想要的是将它们移动到一个新表中,但是每一个匹配都要移动整行 我最好的猜测是类似于SELECT*from SELECT DISTINCT'location'from myTable之类的东西,但它说我有一个模糊的语法错误 有没有一种好方法可以一次抓住每一行的其余部分并将其移动到新表中 SELECT * FROM myTable

我相信这是正确的:

我有一张30000行的桌子。当我从myTable中选择DISTINCT“location”时,它返回21000行,这与我预期的差不多,但它只返回那一列

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

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

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

SELECT * FROM myTable GROUP BY `location`
或者如果你想移动到另一张桌子

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

返回的整行的Distinct方法。因此,您可以简单地使用

SELECT DISTINCT * FROM myTable GROUP BY 'location'
在单个列上使用Distinct没有多大意义。假设我有以下简单的集合

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

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

首先,您需要确定您真正想要返回的内容

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

 Location     OtherCol   StillOtherCol

 Place1       1          Fred
 Place1       89         Fred
 Place1       1          Joe
在这种情况下,您希望选择三行中的哪一行?当您谈论一个不同的位置时,您将这三行不同的数据压缩成一行,将原始行从原始表移动到新表中没有任何意义,因为这些原始行不再存在于不同的结果集中。如果给定位置的所有其他列始终相同,那么问题就更简单了:只需从表中选择DISTINCT*

如果您不关心哪些值来自其他列,您可以使用一个坏的、IMHO MySQL扩展到SQL并执行以下操作:

按位置从表组中选择*


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

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

考虑此表,id为主键:

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:=位置提取样本,例如:

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

有趣的问题名称:赞成票:否决票?希望这是因为我的能力不足,而不是幽默感。难道没有幽默感吗?+1简洁明了,问了些什么;您仍然可以指出,distinct总是在所有列中返回不同的行,mysql中的groupby只在groupby中提到的列中返回不同的行,并随机选择其他非聚合列;这是mysql对标准的扩展,因此在其他数据库中的工作方式不同