SQL Упорядочивание строк в выборе с несколькими условиями - PullRequest
1 голос
/ 01 октября 2019

Я пытаюсь создать запрос SQL для выбора строк из базы данных, упорядоченных по числовому полю, однако в таблице есть повторяющиеся записи. Таблица состоит из следующих столбцов.

UID - числовой уникальный идентификатор

ACCOUNT_NAME - имя учетной записи, без изменений

NICK_NAME - может быть изменено пользователем в любое время

POINTS - Записывает баллы, хранящиеся в учетной записи пользователя

Цель запроса - отобразить упорядоченное по баллам Account_Name. Однако Account_Name не является уникальным и может появляться в таблице несколько раз. Чтобы справиться с этим, я хотел бы отображать только последнюю строку для каждого Account_Name. Это означает, что в результатах выбора каждое Account_Name должно появляться только один раз. Я пытаюсь, чтобы выбор определялся по UID, то есть я хочу, чтобы отображалась только строка с наибольшим UID, в которой отображается каждое имя учетной записи.

Я пробовал следующее без желаемых результатов. (Имя таблицы: ACCOUNT)

SELECT DISTINCT A.account_name , A.uid, A.points
FROM account A, account B
where A.account_name = B.account_name 
and A.points > 0
and A.uid >= B.uid
order by A.points DESC;

Это не дает мне желаемых результатов, в частности, в базе данных есть учетная запись, в которой существует устаревшая строка с высоким значением вPoints столбец. Эта запись появляется в качестве первого результата в выборке, даже если она устарела.

Как бы вы порекомендовали настроить этот запрос для выбора нужной информации?

Надеюсь, этого достаточно для работы (первая публикация вопроса). Спасибо за помощь:)

РЕДАКТИРОВАТЬ: Добавление примеров с данными.

Пример таблицы данных: Пример таблицы данных

Текущие результаты: Текущие результаты

Желаемые результаты: Желаемые результаты

1 Ответ

0 голосов
/ 01 октября 2019

Рассмотрим объединение для составного запроса, вычисляя MAX(UID)

SELECT a.account_name, a.uid, a.points
FROM account a
INNER JOIN 
  (
   SELECT account_name, MAX(uid) AS max_uid
   FROM account
   GROUP BY account_name
  ) agg 
  ON a.account_name = agg.account_name
  AND a.uid = agg.max_uid)
WHERE a.points > 0  
ORDER by a.points DESC;

В качестве альтернативы, в MySQL 8.0 рассмотрим оконную функцию :

SELECT a.account_name, a.uid, a.points
FROM account a    
WHERE a.points > 0  
  AND a.uid = MAX(a.uid) OVER (PARTITION BY a.account_name)
ORDER by a.points DESC;
...