2015-04-08 5 views
0

У меня есть следующие таблицы структуру:MySQL сортировки группы по результатам

table_1

id  title 
------------ 
155 item1 
156 item2 
157 item3 

table_2

id  model 
------------ 
155 100 
156 100 
157 200 

table_3

id  cid 
------------ 
155 5 
156 5 
157 5 

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

Я попытался следующие, но заказ по статье не похоже на работу:

SELECT a.id, b.model FROM table_1 as a 
INNER JOIN table_2 as b on b.id = a.id 
INNER JOIN table_3 as c on c.id = a.id 
WHERE c.cid = 5 
GROUP BY b.model 
ORDER BY a.id desc 

Что я делаю неправильно?

+0

положить 'MAX()' around' a.id'. выбор 'a.id' в результирующем наборе неопределен без него. –

+0

@MrUpsidown. Вы действительно должны поставить свой вывод и ошибку в вопросе. –

ответ

4
SELECT max(a.id), b.model FROM table_1 as a 
INNER JOIN table_2 as b on b.id = a.id 
INNER JOIN table_3 as c on c.id = a.id 
WHERE c.cid = 5 
GROUP BY b.model 
ORDER BY max(a.id) desc 

Demo здесь: http://sqlfiddle.com/#!9/afb0b/2

Причина это работает, пока ваша первая попытка не сделала, что любое поле нет в предложении GROUP BY, или нет используемый в агрегатной функции (например, MAX), будет иметь неопределенное значение (т. е. движок mysql не дает никаких гарантий относительно того, какое значение у группы вы получите).

MySQL GROUP BY Handling

Сервер может свободно выбрать любое значение из каждой группы, так что, если они не совпадают, значение, выбранное неопределенно.

Фактически, MySQL является одной из немногих (только?) SQL-баз данных, которая позволит вам помещать не агрегированное, негруппированное поле в предложение select без ошибок.

+0

Отлично. Большое спасибо! – MrUpsidown

1

Вы можете сделать как

select 
t1.id, 
t2.model 
from table_1 t1 join table_3 t3 on t3.id = t1.id 
join ( 
    select max(id) as id , model from table_2 group by model 
)t2 on t1.id=t2.id 
where t3.cid = 5; 
+0

В чем это было бы лучше, чем @pala_ ответить? Кажется, тоже хорошо работает, но я просто хочу понять оба пути. Благодарю. – MrUpsidown

+0

Используя некоррелированный подзапрос, вы можете ввести более подходящие столбцы относительно таблицы, что невозможно в случае просто 'max' и' group by' –

+0

Все в порядке. Спасибо за совет. – MrUpsidown

Смежные вопросы