Як вибрати 1 стовпець із запиту SQL, який упорядковано за датою?

Таким чином, у мене є приватна модель повідомлення, яка має стовпці: sender_id , recipient_id , content і created_at .

Я хочу вибрати останніх 5 одержувачів, з якими я розмовляв. Однак я не можу зрозуміти, як звузити стовпці.

Мій поточний запит це:

SELECT DISTINCT recipient_id, created_at FROM private_messages WHERE sender_id = :user_id ORDER BY created_at DESC LIMIT 5

Я не можу позбутися стовпця create_at, оскільки це необхідно для ORDER BY . Я повинен бути пропущений, але я не зовсім впевнений, що це таке.

0
Я зрозумів, що це дійсно хитрий альтернативний спосіб зробити це за допомогою підзапитів. Для когось цікаво, це те, що я зробив: SELECT DISTINCT recipient_id FROM (SELECT recipient_id FROM private_messages WHERE sender_id =: user_id ORDER BY created_at DESC) Одержувачі AS LIMIT 5
додано Автор Dasun, джерело

6 Відповіді

.... Я не можу позбутися стовпчика create_at, оскільки це необхідно для ORDER BY.

Ні.

Стовпець "Order by cluase" не обов'язково повинен бути присутнім у списку стовпців SELECT. Ви можете опустити стовпець created_at у списку SELECT свого запиту. Решту вашого запиту буде добре.

Перевірте цей SQL FIDDLE , де показано вище факт.

2
додано
Для вашої вимоги, як зазначено у питанні, чіткого не вимагається ...
додано Автор Mudassir Hasan, джерело
добре, я бачу .. дозвольте мені спробувати
додано Автор Mudassir Hasan, джерело
вибачте чоловік .. я не можу придумати краще рішення, ніж твій ..
додано Автор Mudassir Hasan, джерело
дивно, я вилучив DISTINCT і created_at, і він працює чудово. Однак, коли я додаю DISTINCT назад, я отримую цю помилку: PG :: Error: ERROR: для SELECT DISTINCT, ORDER BY вирази повинні з'явитися у вибраному списку
додано Автор Dasun, джерело
Не зовсім впевнений, що це правильно, я міг би обмінюватися одним і тим самим користувачем 5 разів. Без чітко, я отримав б одержувача_ 5 разів.
додано Автор Dasun, джерело

Спробуйте це

 WITH t AS ( SELECT max(created_at) AS created_at, recipient_id  FROM messages 
 GROUP BY recipient_id  )

 SELECT created_at, recipient_id   FROM t ORDER BY created_at DESC LIMIT 5  
0
додано

Ви не можете опустити стовпчик. Це було кілька разів додано до стандарту SQL.

для SELECT DISTINCT, ORDER BY вирази повинні з'явитись у списку вибраних

Цитувати з тут (повідомлення від Том Лейн.)

Насправді це є причиною визначення. Розглянемо

     

SELECT DISTINCT x FROM ТАБЛИЦЯ ЗАМОВЛЕННЯ BY y;

     

Для будь-якого конкретного x-значення в таблиці може бути багато різних y
  цінності Який з них ви будете використовувати, щоб відсортувати значення x у виведенні?

     

Повернувшись до SQL92, вони уникнули цієї проблеми, вказавши, що ORDER BY BY   записи повинні були посилатися на вихідні стовпці. SQL99 має деякий брудний вербальенство   що я думаю, виходить на тому ж місці, що і наше обмеження

Наприклад, Oracle не застосовує це правило (10g або 11g).

0
додано

Ви пробували щось на зразок нижче:

SELECT TOP 5  recipient_id
FROM private_messages 
WHERE sender_id = :user_id 
GROUP BY recipient_id
ORDER BY created_at DESC

Я вважаю, що вам не потрібен created_at у вашому виборі, щоб використовувати його в порядку за пунктом. Це може залежати від того, яка система бази даних ви використовуєте tho, на сервері SQL це дозволить це.

0
додано
Так, в PostGreSQL видаліть верхню 5 і додайте ліміт 5 назад у кінці.
додано Автор JanR, джерело
Я використовую PostGreSQL .. Синтаксична помилка: PG :: Помилка: ПОМИЛКА: синтаксична помилка в "5" або біля нього
додано Автор Dasun, джерело
Одна й та сама помилка, як і інша відповідь: стовпець "private_messages.created_at" повинен з'явитися в пункті GROUP BY або використовуватись в сукупній функції
додано Автор Dasun, джерело

спробуйте це: SELECT DISTINCT recipient_id, created_at FROM private_messages WHERE sender_id =: user_id GROUP BY recipient_id ORDER BY created_at DESC LIMIT 5

0
додано
чітко і група за бажанням зробить те ж саме в цій ситуації, і якщо ви групу, то вам доведеться групувати за ідентифікатором та датою у вашому прикладі
додано Автор JanR, джерело
Я отримую цю помилку: стовпець "private_messages.created_at" повинен з'явитися в пункті GROUP BY або використовуватись у сукупній функції
додано Автор Dasun, джерело
спробуйте видалити окремі, оскільки група використовується за умовчанням
додано Автор passion, джерело

спробуйте: SELECT recipient_id FROM (SELECT recipient_id, MAX (created_at) як created_at FROM private_messages WHERE sender_id =: user_id GROUP BY recipient_id) ORDER BY created_at DESC LIMIT 5;

0
додано