Поддерживать порядок в ГДЕ (подзапрос) - PullRequest
2 голосов
/ 31 марта 2019

У меня проблема с сохранением порядка в подзапросе с предложением WHERE IN.


Я использую этот следующий запрос с двумя таблицами, перечисленными ниже.

SELECT * FROM user_list WHERE uid IN (
        SELECT uid from user_history ORDER BY timestamp DESC
) LIMIT 5

Таблица - user_list

uid name    surname
001 Alpha   Apples
002 Bravo   Butter
003 Charlie Charlie
004 Delta   Duff
005 Echo    Edward

Таблица - user_history

uid timestamp
003 0000-00-00 00:00:00
001 0000-00-00 00:00:01
005 0000-00-00 00:00:02

Ожидаемый результат (ORDER BY timestamp DESC)

005 Echo    Edward
001 Alpha   Apples
003 Charlie Charlie

Но его результат таков:

001 Alpha   Apples
003 Charlie Charlie
005 Echo    Edward

Предложение ORDER BY игнорируется и все еще упорядочивается по первичному ключу (uid).

Мне интересноЕсть ли способ сохранить заказ из подзапроса?

Ответы [ 4 ]

2 голосов
/ 31 марта 2019

нет необходимости в каком-либо подзапросе, используйте объединение и попробуйте, как показано ниже

SELECT ul.* FROM user_list ul join user_history uh
on ul.uid=uh.uid
order by uh.timestamp desc
limit 5

подзапрос order by не влияет на вывод основного запроса

0 голосов
/ 31 марта 2019

Я думаю, что вы хотите:

SELECT ul.*
FROM user_list ul JOIN
     (SELECT uh.uid, MAX(timestamp) as max_timestamp
      FROM user_history uh
      GROUP BY uh.uid
      ORDER BY MAX(timestamp) DESC
      LIMIT 5
     ) uh
     ON ul.uid = uh.uid
ORDER BY max_timestamp DESC;

Там могут быть дубликаты в user_history (вполне вероятно, в зависимости от имени). Вы, кажется, хотите пять самых последних записей. Таким образом, это объединяет данные для получения пяти самых последних записей, затем соединяется с user_list и возвращает строки в порядке убывания по отметке времени.

0 голосов
/ 31 марта 2019

Ниже запрос может дать вам желаемый результат.Используйте объединение двух таблиц, а затем сортируйте столбцы по отметке времени в основном запросе.

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

SELECT u.uid,  u.name , u.surname FROM user_list u, user_history h  WHERE u.uid IN (
        SELECT uid from user_history 
) and u.uid = h.uid order by h.timestamp desc

0 голосов
/ 31 марта 2019

Сначала вы должны присоединиться к истории пользователей, а затем заказать

SELECT * FROM user_list WHERE uid IN (
        SELECT user_history.uid from user_history join user_list where  
 user_list .uid = user_history.uid  ORDER BY user_history.timestamp DESC
) LIMIT 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...