Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果没有结果,MySql是否选择默认值?_Mysql - Fatal编程技术网

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

如果没有结果,MySql是否选择默认值?,mysql,Mysql,我有两个表:成员和评论。 我选择所有成员,然后加入评论。 但在评论中,我选择了一些点的总和,如果用户从未发表过评论,我就不能让该用户出现在列表中 所以,如果用户从未发表过评论,如何选择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的默认值为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

编辑:

我会尽力解释。。。 因此有两个表、成员和注释。我需要所有的排名用户列表。 评论包含所有投票和最佳答案

所以,我需要所有用户的列表,并且他们得分

成员表:

member_id - username - avatar
评论表

comment_id - author_id - vote_value - best (0 OR 1)

还尝试从注释中选择并加入成员,但同样的事情是:(

您可以使用if语句将NULL转换为0

SELECT c.comment_id AS item_id, ...
    IF(SUM(c.vote_value) is null, 0, SUM(c.vote_value)) as vote_value
FROM members m
LEFT JOIN comments c ON ...

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

您也可以查看案例陈述:

在你的情况下,结果将类似于

SELECT c.comment_id AS item_id, m.member_id AS member_id, m.avatar, 
        (CASE SUM(c.vote_value) WHEN NULL THEN 0  
        ELSE SUM(c.vote_value) END) AS vote_value, SUM(c.best) AS best, 
        (CASE SUM(c.vote_value) + SUM(c.najbolji)*10 WHEN null THEN 0
        ELSE SUM(c.vote_value) + SUM(c.najbolji)*10 END) 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

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

正如其他人提到的,COALESCE做了类似的事情(在MySQL中也能工作)。

我认为总和不是问题所在。我认为可能是你的问题

GROUP BY c.author_id
按左侧外部联接的右侧进行分组。我不确定当右侧不存在时会发生什么,但我猜这不是您真正想要的。您很可能应该按成员中的某些内容进行分组,而不是按注释进行分组


话虽如此,您还是应该使用COALESCE或IFNULL将空值设置为0。

如果您只想要用户和他们的排名,我不知道为什么要在选择列表中包含评论id。您只想要他们在该特定评论上的排名吗?我现在给出一个解决方案,假设您只想要一个完整的成员列表排名:

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

(这假设vote_value和best不是空列,或者MySQL在计算求和值时会忽略这些列——我相信是的,但我还没有对此进行测试)

您能提供一些具有预期输出的示例数据吗?我不使用MySQL,所以它们可能有一些快捷语法,但您只在一列上分组,但在您的数据库中有几个非聚合列SELECT@TomH:MySQL实际上允许这种语法:。谢谢Peter。我知道至少有一个主要的RDBMS允许这种语法,但记不得了因为它允许“不合逻辑”的分组,它可能会导致“丢失”数据,因为使用此功能时,每个组中的所有行都应该具有从组中逐部分写入的列的相同值。服务器可以从组中自由返回任何值,因此除非所有值都相同,否则结果是不确定的。“c.comment_id对于给定的c.author_id可能并不总是相同的。我用表格结构编辑了我的问题,也许这会有助于更好地理解。感谢您分解查询并重新构建它,以查看哪个部分分解它。只需从“选择m.member_id,SUM(c.vote_值)…”开始。”为了确保有效,然后一次一个地添加其他的和和和列来发现问题。COALESCE做同样的事情,但更简单。SUM(COALESCE(c.vote_value,0))这是一个笨拙的机制。IF(x为NULL,y,x)不是很整洁。@nathan:以前不知道,但刚刚用过。谢谢(顺便说一句,我必须使用COALESCE(总和(col),0)因为另一种方法仍然返回null。在需要默认值的情况下,这可能比COALESCE要好一点。列表中也没有所有用户:\n那么@nathan很可能是正确的。尝试在m.member\u id而不是c.author\u id上分组,看看是否有帮助。仍然没有:(我用表格和结构编辑了我的问题,也许会有帮助,谢谢。不幸的是,这太笨重了。我用分组m.member_id进行了尝试,但仍然相同,列表中没有所有用户。我用表格结构编辑了我的问题,也许会有助于更好地理解。谢谢分解你的查询并重新构建它,以查看是什么部分。)答:从“选择m.member_id,SUM(c.vote_value)FROM…”开始,确保其有效,然后一次一个地添加其他总和和列以查找问题。