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