2013-02-14 75 views
1

组重复行我有一个表:

id_object | version | document 
------------------------------ 
1   | 1  | 1 
1   | 2  | 2 
2   | 1  | 3 
2   | 2  | 1 
2   | 3  | 2 
1   | 1  | 3 

我想只显示一个由对象行与版本(max)和文档。我曾尝试以下”

Select Distinct 
    id_object , 
    Max(version), 
    document 
From 
    prods 
Group By 
    id_object, document 

,我得到这样的结果

1   | 1  | 1 
1   | 2  | 2 
2   | 1  | 3 
2   | 2  | 1 
2   | 3  | 2 
1   | 1  | 3 

正如你所看到的,我得到了整个表。我的问题是,为什么呢?

回答

2

既然你id_objectdocument,你不会得到你想要的结果,这是因为document是不同的每个version

select x.id_object, 
     x.maxversion as version, 
     p.document 
from 
(
    Select id_object, Max(version) as maxversion 
    From prods 
    Group By id_object 
) x 
inner join prods p on p.id_object = x.id_object 
        and p.version = x.maxversion 

您首先必须选择id_objectmax(version)。可以将其与实际数据结合以获得正确的document

您必须这样做,因为您不能选择不在group by子句中的列,除非您在其上使用了聚合函数(例如max())。

(MySQL能够选择非聚集列,但请避免因为其结果并不总是很清楚,甚至可以预测)

0
select prods.id_object, version, document 
from prods inner join 
(select id_object, max(version) as ver 
from prods 
group by id_object) tmp on prods.id_object = tmp.id_object and prods.version = tmp.ver 
0

查询:

SQLFIDDLEExample

SELECT p.id_object, 
     p.version, 
     p.document 
FROM prods p 
WHERE p.version = (SELECT Max(version) 
        FROM prods 
        WHERE id_object = p.id_object) 

结果:

| ID_OBJECT | VERSION | DOCUMENT | 
---------------------------------- 
|   1 |  2 |  2 | 
|   2 |  3 |  2 |