如果没有结果,MySql选择默认值?

Ken*_*nan 17 mysql

我有两张桌子:成员和评论.我选择所有成员,然后加入评论.但是在评论中我选择了一些点数的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).


Dav*_*d M 6

我用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)