我四处寻找答案,但我找不到。我有一个站点,文章存储在文章表中,而作者则存储在用户表中。我想根据最近他们撰写文章的方式获得一份作者名单。
这给了我用户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
但两者都改变了名字的顺序。我显然做了一些愚蠢的事,但是什么呢?
答案 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