从mysql查询中的表中获取前3名评论员

Posted

技术标签:

【中文标题】从mysql查询中的表中获取前3名评论员【英文标题】:Get the top 3 commentator from a table in mysql query 【发布时间】:2012-07-15 05:41:39 【问题描述】:

我有 3 张桌子

comments(id,question_id, user_Id) // here the user_id is of the user who has asked the question
questions(id,q_desc, user_id)
users(id, name, rank)

用户可以提出问题,也可以对问题发表评论。

我需要一个报告,我希望在其中显示每个问题,最多有 3 个排名靠前的用户发表评论,但提出问题的用户不应该出现在该特定问题的报告中,但他也有权对他的问题发表评论。

已编辑:::

Select * from comments inner join users(comments.user_id=u.id) group by question_id order by user.rank desc

【问题讨论】:

@Nerd-Herd:那时我没有添加我的查询,因为我在开始这个问题时遇到了问题,因为问题在于每个问题排名前 3 的用户 【参考方案1】:

虽然很乱,但很有效:

SELECT 
    a.question_id, a.user_id, a.name, a.rank
FROM
(
    SELECT a.*, b.name, b.rank
    FROM
    (
        SELECT DISTINCT b.question_id, b.user_id
        FROM questions a
        INNER JOIN comments b ON a.id = b.question_id AND a.user_id <> b.user_id
    ) a
    INNER JOIN users b ON a.user_id = b.id
) a
INNER JOIN
(
    SELECT a.question_id, b.rank
    FROM
    (
        SELECT DISTINCT b.question_id, b.user_id
        FROM questions a
        INNER JOIN comments b ON a.id = b.question_id AND a.user_id <> b.user_id
    ) a
    INNER JOIN users b ON a.user_id = b.id
) b ON a.question_id = b.question_id AND a.rank <= b.rank
GROUP BY 
    a.question_id, a.user_id, a.name, a.rank
HAVING 
    COUNT(1) <= 3
ORDER BY 
    a.question_id, a.rank DESC

编辑:这会产生相同的结果并且更简洁:

SELECT a.*
FROM
(
   SELECT DISTINCT a.question_id, a.user_id, b.name, b.rank
   FROM comments a
   INNER JOIN users b ON a.user_id = b.id
) a
INNER JOIN 
    questions b ON a.question_id = b.id AND a.user_id <> b.user_id
INNER JOIN
(
   SELECT DISTINCT a.question_id, a.user_id, b.rank
   FROM comments a
   INNER JOIN users b ON a.user_id = b.id
) c ON b.id = c.question_id AND a.rank <= c.rank
GROUP BY 
    a.question_id, a.user_id, a.name, a.rank
HAVING 
    COUNT(1) <= 3
ORDER BY 
    a.question_id, a.rank DESC;

这些解决方案还考虑了在同一问题中发表了多个评论的用户。

在SQLFiddle查看这两种解决方案的实际应用

【讨论】:

优秀的赞恩,我接受你的回答,你能帮我解决层次问题***.com/questions/11064913/… @SashiKant,谢谢!顺便说一句,如果您有兴趣,我只是制作了一个更简洁的解决方案版本。请参阅修改后的答案。

以上是关于从mysql查询中的表中获取前3名评论员的主要内容,如果未能解决你的问题,请参考以下文章

如何从mysql中的表中选择N条记录

如何从mysql中的表中删除重复的行

需要 Python 3.7 中的 Mysql 查询以从具有列 (table_no, is_new) 的表中选择记录

MySQL查询从具有1000万行的表中获取每个条目的最新记录

MySQL 从两个不同的表中获取 user_id 和密码的查询

MySql 查询从表中找出前 50% 的记录