我有4列叫ID,EQUIPID,VERSION,DESCRIPTION。用户可以添加额外的列,以便SQL语句需要动态。列ID是唯一的,永远不会重复; EQUIPID描述了一个设备,这意味着多个EQUIPID可以相同;和VERSION描述了相同EQUIPID条目之间的差异。SQL Statement - SELECT * with MAX()
我如何查询SELECT *并获得每个EQUIPID与最大版本之一?
我有4列叫ID,EQUIPID,VERSION,DESCRIPTION。用户可以添加额外的列,以便SQL语句需要动态。列ID是唯一的,永远不会重复; EQUIPID描述了一个设备,这意味着多个EQUIPID可以相同;和VERSION描述了相同EQUIPID条目之间的差异。SQL Statement - SELECT * with MAX()
我如何查询SELECT *并获得每个EQUIPID与最大版本之一?
SELECT tn.*
FROM table_name tn
WHERE tn.version =
(SELECT MAX(sq.version)
FROM table_name sq
WHERE sq.equipid = tn.equipid);
基本上,选择版本等于该equipid的最大版本的行。
尝试
SELECT * FROM table
GROUP BY EquipID
HAVING max(Version)
另一种方式来创建临时表,然后从两个表连接
mysql> CREATE TABLE tmp
-> SELECT name, MAX(Version) AS max_ver
-> FROM tableName GROUP BY EquipID;
mysql> SELECT t.*
-> FROM tableName t, tmp
-> WHERE t.id = tmp.id
或使用自连接
select *
from tableName tn
where (
select count(*) from table t
where t.equipId = tn.equipId and t.version > tn.version
) <= 2;
select *
from yourtable
where ID in (
select max(ID)
from
yourtable
where EQUIPID = xxx
);
内查询得到那么指定设备的最高ID外部查询会提取该设备记录中的其余数据。
嗯我不认为这是正确的。 OP要求最大版本不是每个设备的最大ID –
是的,这对我来说也不合适。 – Patrick87
@Conrad:但是由于ID是自动分配的并且不会重复,所以最高版本也意味着最高ID。 –
这里有一个办法做到这一点
SELECT yt.*
FROM yourtable yt
INNER JOIN (SELECT equipid,
Max(version) AS version
FROM yourtable) AS maxversion
ON yt.equipid = maxversion.equipid
AND yt.version = maxversion.version;
但是这取决于你的数据库,你可以做到这一点在其他方面。例如使用ROW_NUMBER()
工作得完美, –
如果你喜欢它,请戴上戒指(接受......帮助其他人辨别出好的答案 - 就像迄今为止评分最高的答案一样)。 – Patrick87
+1为完美的解决方案 – diEcho