2011-07-22 178 views
2

我有4列叫ID,EQUIPID,VERSION,DESCRIPTION。用户可以添加额外的列,以便SQL语句需要动态。列ID是唯一的,永远不会重复; EQUIPID描述了一个设备,这意味着多个EQUIPID可以相同;和VERSION描述了相同EQUIPID条目之间的差异。SQL Statement - SELECT * with MAX()

我如何查询SELECT *并获得每个EQUIPID与最大版本之一?

回答

3
SELECT tn.* 
    FROM table_name tn 
    WHERE tn.version = 
      (SELECT MAX(sq.version) 
      FROM table_name sq 
      WHERE sq.equipid = tn.equipid); 

基本上,选择版本等于该equipid的最大版本的行。

+0

工作得完美, –

+0

如果你喜欢它,请戴上戒指(接受......帮助其他人辨别出好的答案 - 就像迄今为止评分最高的答案一样)。 – Patrick87

+0

+1为完美的解决方案 – diEcho

1

尝试

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; 
+1

分组时,您不能保证在各个字段中获得相同的值 - 对于MySQL,您倾向于获得找到的第一个值,它将来自较低的ID。 –

+0

@Marc你right ..im更新我的答案 – diEcho

+0

参考:http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in- sql/ – diEcho

2
select * 
from yourtable 
where ID in (
    select max(ID) 
    from 
    yourtable 
    where EQUIPID = xxx 
); 

内查询得到那么指定设备的最高ID外部查询会提取该设备记录中的其余数据。

+1

嗯我不认为这是正确的。 OP要求最大版本不是每个设备的最大ID –

+0

是的,这对我来说也不合适。 – Patrick87

+0

@Conrad:但是由于ID是自动分配的并且不会重复,所以最高版本也意味着最高ID。 –

1

这里有一个办法做到这一点

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()