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

2 php mysql sql

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

ID TIME DATA
1  xx   xx
2  xx   xx
3  xx   xx
1  xx   xx
3  xx   xx
Run Code Online (Sandbox Code Playgroud)

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

ID TIME DATA
1  xx   xx
2  xx   xx
3  xx   xx
Run Code Online (Sandbox Code Playgroud)

Bil*_*win 11

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

在这种情况下,@ T Pops给出的答案实际上是有用的,因为MySQL以非标准的方式处理GROUP BY.请参阅我的答案" 选择不在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;
Run Code Online (Sandbox Code Playgroud)

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


Aid*_*ell 5

选择SELECT DISTINCT的观众

  • 嘿,我有兴趣看到解决这个问题的实际DISTINCT查询!:) (2认同)

Tra*_*vis 5

这听起来像你在寻找GROUP BY.

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

SELECT id, time, data GROUP BY ID
Run Code Online (Sandbox Code Playgroud)

您肯定需要做一些调整才能使该查询与您拥有的结构一起工作,但这是基本的想法.

Tizag对于使用GROUP BYMySQL和PHP 有很好的参考.