通过联接表加入MySQL中的Select Distinct重新排序

时间:2011-10-19 20:25:15

标签: mysql join sql-order-by

我四处寻找答案,但我找不到。我有一个站点,文章存储在文章表中,而作者则存储在用户表中。我想根据最近他们撰写文章的方式获得一份作者名单。

这给了我用户ID:

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

问题在于,只要我尝试通过加入订单更改来引入名称,以便按用户ID进行更改。我试过这个:

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 个答案:

答案 0 :(得分:1)

在第一个示例中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

答案 1 :(得分:0)

试试这个

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

答案 2 :(得分:0)

您的ORDER BY按用户ID和/或文章ID对行进行排序(取决于示例)。

如果您希望按名称进行可靠的排序,请在ORDER BY字段中包含u.name字段。

答案 3 :(得分:0)

以下内容应该有效:

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

答案 4 :(得分:0)

这是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