我相信这是明确的前进:
我有一张包含30,000行的表格。当我SELECT DISTINCT 'location' FROM myTable
时,它返回21,000行,大约是我期望的,但它只返回那一列。
我想要的是将它们移动到一个新表,但每个匹配的整行。
我最好的猜测类似于SELECT * from (SELECT DISTINCT 'location' FROM myTable)
或类似的东西,但它说我有一个模糊的语法错误。
有没有一种方法可以抓住每个DISTINCT行的其余部分并一次性将其移动到新表中?
答案 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