我有两张桌子:成员和评论.我选择所有成员,然后加入评论.但是在评论中我选择了一些点数的SUM,如果用户从未评论过,我无法在列表中获得该用户?!
因此,如果用户从未注释过,或者其他一些解决方案,如何选择SUM的默认值为0:
SELECT c.comment_id AS item_id, m.member_id AS member_id, m.avatar,
SUM(c.vote_value) AS vote_value, SUM(c.best) AS best,
SUM(c.vote_value) + SUM(c.best)*10 AS total
FROM members m
LEFT JOIN comments c ON m.member_id = c.author_id
GROUP BY c.author_id
ORDER BY m.member_id DESC
LIMIT 0, 20
Run Code Online (Sandbox Code Playgroud)
编辑:
我将尝试解释......所以有2个表,成员和评论.我需要列出所有排名的用户.评论持有所有选票和最佳答案.
所以,我需要列出所有用户,然后他们得分.
会员表:
member_id - username - avatar
Run Code Online (Sandbox Code Playgroud)
评论表
comment_id - author_id - vote_value - best (0 OR 1)
Run Code Online (Sandbox Code Playgroud)
还尝试从COMMENTS中选择并加入MEMBERS,但同样的事情:(
Tom*_*m H 22
如果您只是想要用户及其排名,我不确定您为什么要将SELECT_id包含在SELECT列表中.你只想要他们对那个特定评论的排名吗?我现在给出一个解决方案,假设您只想要一个包含排名的完整成员列表:
SELECT
M.member_id,
M.user_id,
M.avatar,
COALESCE(SUM(C.vote_value), 0) AS vote_value_sum,
COALESCE(SUM(C.best), 0) AS best_sum,
COALESCE(SUM(C.vote_value), 0) + SUM(C.best) * 10 AS total_value
FROM
Members M
LEFT OUTER JOIN Comments C ON
C.author_id = M.member_id
GROUP BY
M.member_id
ORDER BY
total_value DESC
LIMIT 0, 20
Run Code Online (Sandbox Code Playgroud)
(这假设vote_value和best是非NULL列,或MySQL在计算SUM值时会忽略它们 - 我相信它确实如此,但我没有测试过)
Mic*_*odd 20
MySQL有一个IFNULL运算符,如果结果为null,它允许你返回null以外的值.
SELECT c.comment_id AS item_id, m.member_id AS member_id, m.avatar,
SUM(IFNULL(c.vote_value, 0)) AS vote_value, SUM(IFNULL(c.best, 0)) AS best,
SUM(IFNULL(c.vote_value, 0)) + SUM(IFNULL(c.best, 0))*10 AS total
FROM members m
LEFT JOIN comments c ON m.member_id = c.author_id
GROUP BY c.author_id
ORDER BY m.member_id DESC
LIMIT 0, 20
Run Code Online (Sandbox Code Playgroud)
正如其他人提到的,COALESCE做了类似的事情(也适用于MySQL).
我用COALESCE这种东西.
http://dev.mysql.com/doc/refman/5.1/en/comparison-operators.html#function_coalesce
我会将你的第二行和第三行重写为:
COALESCE(SUM(c.vote_value), 0) AS vote_value, COALESCE(SUM(c.best),0) AS best,
COALESCE(SUM(c.vote_value), 0) + COALESCE(SUM(c.best),0) * 10 AS total
Run Code Online (Sandbox Code Playgroud)