Объединение в Select Distinct в MySQL переупорядочивается по объединенной таблице - PullRequest
1 голос
/ 20 октября 2011

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

Это дает мне идентификаторы пользователя:

SELECT distinct a.user_id 
FROM `article` as a 
ORDER BY a.id desc

Проблема в том, что, как только я пытаюсь ввести имена, присоединяясь к изменениям порядка, так что это по идентификатору пользователя. Я пробовал это:

SELECT distinct a.user_id, u.name 
FROM `article` as a 
LEFT JOIN user as u on u.id  = a.user_id 
ORDER BY a.id desc, u.id desc

и

SELECT distinct a.user_id, u.name 
FROM `article` as a 
LEFT JOIN user as u on u.id  = a.user_id 
ORDER BY u.id desc, a.id desc

но оба изменяют порядок имен. Я, очевидно, делаю что-то глупое, но что?

Ответы [ 5 ]

1 голос
/ 20 октября 2011

Тот факт, что DISTINCT работает с ORDER BY в вашем первом примере, является случайностью, а не стандартным SQL.Вам нужно что-то вроде этого:

SELECT a.user_id, u.name 
  FROM article a 
  LEFT JOIN user u ON u.id = a.user_id 
  GROUP BY a.user_id
  ORDER BY MAX(a.id) desc
0 голосов
/ 20 октября 2011

это синтаксис postgres, но вы можете легко перевести его в mysql

select u.*, q.last_article_id 
   from user u
      inner join (
        select a.user_id, max(a.id) as last_article_id
           from article a
           group by a.user_id
      ) q
      on u.id = a.q.id
   order by q.last_article_id desc
0 голосов
/ 20 октября 2011

Ваш ORDER BY сортирует строки по ИД пользователя и / или ИД статьи (в зависимости от примера).

Если вам нужна надежная сортировка по имени, включите поле u.name в поля ORDER BY.

0 голосов
/ 20 октября 2011

Что-то вроде следующего должно работать:

select users.id, articles.id, max(articles.created_at) as recent_date
  from users
  left join articles on users.id = articles.user_id
  group by articles.id
  order by recent_date

Не уверен, что именно ваши поля названы и все, но это должно указать вам в правильном направлении.

Вы можете выбрать из множества ответов ... Я считаю, что ключом к тому, что вы спрашиваете, является использование агрегатной функции MAX () http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_max

0 голосов
/ 20 октября 2011

попробуйте

SELECT a.user_id, u.name 
FROM `article` a 
LEFT JOIN user u on u.id = a.user_id 
GROUP BY a.user_id
ORDER BY a.id desc
...