如何为MySQL中的每个ID只选择一行?

时间:2009-06-23 18:53:29

标签: php sql mysql

我有一个MySQL表,其中包含许多具有重复ID的条目(出于各种原因) 所以你可能会有像

这样的东西
ID TIME DATA
1  xx   xx
2  xx   xx
3  xx   xx
1  xx   xx
3  xx   xx

我可以通过PHP运行哪些查询来只选择一次ID? 所以我希望我的结果集看起来像

ID TIME DATA
1  xx   xx
2  xx   xx
3  xx   xx

6 个答案:

答案 0 :(得分:11)

@ karim79和@Matthew Jones提出的DISTINCT(ID)可以解决这个问题的建议是对DISTINCT在SQL中的工作方式的一种常见误解。这没有用,因为DISTINCT 总是适用于整行,而不是单个列。括号是无关紧要的,因为它们将出现在SELECT (1)SELECT 1的查询中。

@T Pops给出的答案在这种情况下实际上是有用的,因为MySQL以非标准的方式处理GROUP BY。有关解释,请参阅我对“Selecting a Column not in GROUP BY”的回答。

另一种解决方案是创造性地使用LEFT OUTER JOIN来查询每ID的第一行。例如,假设 TIME列对于给定的ID是唯一的,您可以执行以下操作:

SELECT t1.*
FROM MyTable t1 LEFT OUTER JOIN MyTable t2
  ON (t1.ID = t2.ID AND t1.TIME > t2.TIME)
WHERE t2.ID IS NULL;

如果t1指向组中最早的行,则t2中可能没有与较早日期匹配的行。因此,LEFT OUTER JOIN将找不到匹配项,并将t2.*保留为NULL。

答案 1 :(得分:5)

SELECT DISTINCT

中选择一个ganders

答案 2 :(得分:5)

听起来你正在寻找GROUP BY

您可以使用类似于以下的查询:

SELECT id, time, data GROUP BY ID

你肯定要做一些调整,以使查询与你所拥有的结构一起工作,但这是基本的想法。

Tizag对于将GROUP BY用于MySQL和PHP有很好的参考。

答案 3 :(得分:0)

SQL Query看起来像这样:

SELECT DISTINCT (ID), TIME, DATA FROM TableName

答案 4 :(得分:0)

向表中添加一个真正的主键,可能称为RealId。

然后你可以:

select *
from YourTable
where realid in (
    select min(realid)
    from YourTable
    group by id
)

每个id会给你一行。

答案 5 :(得分:0)

SELECT * FROM MyTable GROUP BY ID ORDER BY ID ASC