MySQL对查询返回的行进行计数和排序

时间:2014-08-05 17:18:23

标签: mysql sql sorting join count

我有以下MySQL表,其中包含以下字段:

"问题"

question_id (PK, AI), author_id (FK), approved ...

"用户"

user_id (PK, AI), username, role ...

我想返回那些问题最多且批准等于' Y'的人的用户名。按降序排列,但角色必须等于' 1'。

例如,假设所有用户的角色等于' 1,则以下数据应返回author_id 2的用户名字段,后跟author_id 1。

question_id author_id  approved
--------    -----      ----
1           1          Y
2           1          N
3           2          Y
4           2          Y
5           3          N

到目前为止,我已经得到以下信息:

SELECT Q.question_id, Q.author_id, Q.approved, U.role
FROM p1209279x.questions Q
LEFT JOIN p1209279x.users U
ON U.user_id=Q.author_id
WHERE approved='Y' AND role='1';

但是这会返回多个具有相同user_id的行,那么如何计算返回的每个user_id的行并输出各自的用户名?

2 个答案:

答案 0 :(得分:1)

只需在SELECT列表中添加聚合函数(例如COUNT()SUM()),并在查询中添加GROUP BY子句,并在ORDER BY子句中添加SELECT U.username , COUNT(Q.question_id) FROM ... GROUP BY Q.author_id ORDER BY COUNT(Q.question_id) DESC 子句查询。

role

请注意,查询的WHERE子句中U.role = '0'列的谓词否定了LEFT JOIN操作的“外部性”。 (使用LEFT JOIN,Q中没有找到U中匹配行的任何行将为U中的所有列返回NULL。在WHERE子句中添加谓词username将导致在U.role中具有NULL值的任何行都将被排除。


这将返回SELECT U.username , COUNT(Q.question_id) FROM p1209279x.questions Q JOIN p1209279x.users U ON U.user_id=Q.author_id WHERE Q.approved='Y' AND Q.role='0' GROUP BY Q.author_id ORDER BY COUNT(Q.question_id) DESC 的不同值,以及与该用户相关的问题的“计数”:

{{1}}

答案 1 :(得分:0)

您必须为查询添加计数:

SELECT count(U.user_id) as UserCount, Q.question_id, Q.author_id, Q.approved, U.role
FROM p1209279x.questions Q
LEFT JOIN p1209279x.users U
ON U.user_id=Q.author_id
WHERE approved='Y' AND role='0'
GROUP BY UserCount, Q.question_id, Q.author_id, Q.approved, U.role;

但是这可能仍会返回太多行,因为它们可能仍然是唯一的。如果您只想要原始计数,则必须从选择中删除一些行。但那是基本的想法。