2013-02-14 2 views
1

У меня есть одна таблица:отдельных строк с группой по

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

Я хочу, чтобы показать только один ряд по объекту с версией (макс) и документа. Я попытался следующие»

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_objectиdocument, вы не получите желаемого результата. это происходит потому, что 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_object с помощью max(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 | 
Смежные вопросы