2015-11-17 4 views
1

У меня есть база данных с 4-мя столами, как показано ниже:SQL присоединяется: группа с порядком

USER table: 
* id: INTEGER, AUTO INCREMENT... 
* name: VARCHAR 

PRODUCT table: 
* id: INTEGER, AUTO INCREMENT... 
* name: VARCHAR 


ORDER table: 
* id: INTEGER, AUTO INCREMENT... 
* number: VARCHAR 
* user_id: FOREIGN KEY to USER table 
* date_created: DATETIME 

ORDER_TO_PRODUCT table: 
* order_id: FOREIGN KEY to ORDER table 
* product_id: FOREIGN KEY to PRODUCT table 
* quantity: INTEGER 

Я хочу создать запрос, который будет список всех пользователей, каждый из которых имеет это последний заказ сделал (согласно order.date_created) дата и номер.

Моя идея состоит в том, чтобы сгруппировать все результаты от пользователей (сделать одну строку для каждого пользователя), а затем заказать по дате заказа. Однако это, похоже, не работает:

SELECT u.name, o.date_created, o.number 
FROM order o 
INNER JOIN user u ON o.user_id = u.id 
GROUP BY o.user_id 
ORDER BY o.created DESC 

Вопрос в том, что я делаю это неправильно? И возможно ли достичь цели без подзапросов?

+0

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

+0

Какая ошибка у вас? – genespos

+0

@genespos Я просто их отсортировал неправильно. Похоже, что этап GROUP выполняется как первый, случайные строки помещаются в каждую группу, а затем идет ORDER BY, который упорядочивает эти неправильные элементы. – ducin

ответ

2

Ваш вопрос должен знать, что делать с u.name, o.date_created и o.number. Недостаточно ORDER BY. Единственное поле, которое вы можете в настоящий момент адресовать без агрегационной функции, - o.user_id, так как это ваш GROUP BY.

Чтобы найти последний сделанный заказ, вам обычно необходимо использовать функции окна, такие как PARTITION OVER. Но если ваш date_created и номер упорядочены естественным образом, вы также можете использовать простой MAX

SELECT o.user_id, MAX(u.name), MAX(o.date_created), MAX(o.number) FROM order o INNER JOIN user u ON o.user_id = u.id GROUP BY o.user_id

В противном случае проверить эту документацию для функций окна: http://www.postgresql.org/docs/9.5/static/tutorial-window.html

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