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

Php 如何在MySQL中为每个ID只选择一行?,php,sql,mysql,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 看看选择DISTINCTSQL查询如下所示: SELECT DISTINCT (ID), TIME, DA

我有一个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

看看选择DISTINCT

SQL查询如下所示:

SELECT DISTINCT (ID), TIME, DATA FROM TableName

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

然后你可以:

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

这将为每个id提供一行。

听起来您正在寻找
分组依据

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

SELECT id, time, data GROUP BY ID
您肯定需要做一些调整,以使该查询与您拥有的结构一起工作,但这是基本的想法


对于在MySQL和PHP中使用
groupby
有很好的参考。

由@karim79和@Matthew Jones给出的建议是
DISTINCT(ID)
可以解决这个问题,这是关于DISTINCT在SQL中工作方式的常见误解。它没有帮助,因为
DISTINCT
始终应用于整行,而不是单个列。括号是不相关的,因为它们会出现在查询
SELECT(1)
SELECT 1

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

另一种解决方案是创造性地使用
左外部联接
,根据
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中可能没有与较早日期匹配的行。因此,
左外部联接将找不到匹配项,并将
t2.
保留为空。

这将选择两个记录(1,'2009-05-16','x'),(1,'2009-04-11','y'),因为它们在时间和数据上不同。我知道我忘了什么。谢谢这就是我不使用MySQL编程的原因;太放纵了。马修·琼斯:这与MySQL无关。DISTINCT在标准SQL中的工作原理与在MySQL或任何其他品牌的数据库中的工作原理相同。DISTINCT始终应用于整行,而不是单个列,即使使用括号也是如此。结果中的时间和数据是什么?具有特定id的第一条记录的值(那么问题是为什么)?或者某些聚合函数的结果(Count(),Sum()甚至可能是Group_Concat())?或什么?DISTINCT并不能解决您的问题。+1这在MySQL中实际上是可行的,因为MySQL以非标准方式处理GROUP BY。它实际上保证从同一行返回时间+数据吗?不,它不保证从哪一行获取值。实际上,它首先从物理存储的行中获取它们。如果这是OP想要的,那么他可以使用它(假设MySQL在未来的版本中不会改变行为)?从第一排开始就不需要时间,从第四排开始就不需要数据了?你们真是太棒了!独特的作品完美。GROUPBY也很好,但我认为在这种情况下我需要使用DISTINCE。感谢所有回复的人!呵呵,我很想看看解决这个问题的真正不同的查询@鲁德布约克。。。在不同的id上进行连接不是更好吗?啊,那么您只是在查找id,而不是其他列。这就解释了:)但是他在问题的结果中仍然有时间和数据列。很好的解释。我会在大约八小时后回来给你投票;-)@思南:这是不是说JOIN的表现很差?您应该尝试使用EXPLAIN来查看如下查询的优化计划。然后将其与GROUP BY或DISTINCT查询的计划进行比较,后者通常必须使用临时表。@Bill我今天的票数不足,所以我无法对你的答案进行投票。必须指出,DISTINCT在这里不是一个合适的“解决方案”。你剩下的解释很清楚。我的回答中并没有讽刺,只是对当时我没能给你们投票表示真正的遗憾。谢谢!哈哈——我还以为你是在发牢骚,好像你期望查询需要八个小时才能完成,而你在投票前就在等待着呢。:-)在这个答案成为正式答案之前,这个问题不值得a+1。
SELECT * FROM MyTable GROUP BY ID ORDER BY ID ASC