我有以下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的行并输出各自的用户名?
答案 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;
但是这可能仍会返回太多行,因为它们可能仍然是唯一的。如果您只想要原始计数,则必须从选择中删除一些行。但那是基本的想法。