【问题标题】:MySQL query - Multiple sums across multiple tables, need to ignore null valuesMySQL查询 - 跨多个表的多个总和,需要忽略空值
【发布时间】:2018-05-01 06:15:35
【问题描述】:

我正在尝试从 5 个不同的表中对 thumbsup 减去 thumbsdown 进行以下 SUM,然后将所有这些值加在一起,如果所有“commthumbs”都返回一行,但如果一个或多个“commthumbs”有没有行然后它返回一个空值。我尝试使用 IFNULL,如下面的第一个 LEFT JOIN 所示。我也尝试过 ISNULL 和 COALESCE 代替 IFNULL 但似乎仍然无法让它工作。关于我做错了什么有什么建议吗?

    SELECT 
        user.userID, user.username,
        SUM(a.commthumbs+b.commthumbs+c.commthumbs+d.commthumbs) AS 'commthumbs', 
        e.fixthumbs AS 'fixthumbs'
    FROM
        user

    LEFT JOIN (
        SELECT 
        userID, IFNULL(SUM(gameCommThUp-gameCommThDown),0) AS 'commthumbs'
        FROM
        gamecomm
        GROUP BY userID) a ON a.userID = user.userID

    LEFT JOIN (
        SELECT 
        userID, SUM(fixCommThUp-fixCommThDown) AS 'commthumbs'
        FROM 
        fixcomm
        GROUP BY userID) b ON b.userID = user.userID

    LEFT JOIN (
        SELECT 
        userID, SUM(replyCommThUp-replyCommThDown) AS 'commthumbs'
        FROM gamereply
        GROUP BY userID) c ON c.userID = user.userID

    LEFT JOIN (
        SELECT userID, SUM(fixReplyThUp-fixReplyThDown) AS 'commthumbs'
        FROM fixreply
        GROUP BY userID) d ON d.userID = user.userID

    LEFT JOIN (
        SELECT 
        userID, SUM(fixThUp-fixThDown) AS 'fixthumbs'
        FROM 
        fix
        GROUP BY userID) e ON e.userID = user.userID

    WHERE user.userID = 2;

【问题讨论】:

  • 你能不能这样尝试:SUM(IFNULL(gameCommThUp,0)-IFNULL(gameCommThDown,0)) 在你所有的加入中
  • 您正在对 SUM 进行 IFNULL 处理 - 正如您突出显示的那样,如果任何值为 null 则返回 null。根据上面的评论,您需要在求和之前将该值设为 IFNULL。

标签: mysql sql


【解决方案1】:

试试这个

  SELECT 
        user.userID, user.username,
        SUM(IFNULL(a.commthumbs,0)+IFNULL(b.commthumbs,0)+IFNULL(c.commthumbs,0)+IFNULL(d.commthumbs,0)) AS 'commthumbs', 
        IFNULL(e.fixthumbs,0) AS 'fixthumbs'
    FROM
        user

    LEFT JOIN (
        SELECT 
        userID, SUM(IFNULL(gameCommThUp,0)-IFNULL(gameCommThDown,0)) AS 'commthumbs'
        FROM
        gamecomm
        GROUP BY userID) a ON a.userID = user.userID

    LEFT JOIN (
        SELECT 
        userID, SUM(IFNULL(fixCommThUp,0)-IFNULL(fixCommThDown,0)) AS 'commthumbs'
        FROM 
        fixcomm
        GROUP BY userID) b ON b.userID = user.userID

    LEFT JOIN (
        SELECT 
        userID, SUM(IFNULL(replyCommThUp,0)-IFNULL(replyCommThDown,0)) AS 'commthumbs'
        FROM gamereply
        GROUP BY userID) c ON c.userID = user.userID

    LEFT JOIN (
        SELECT userID, SUM(IFNULL(fixReplyThUp,0)-IFNULL(fixReplyThDown,0)) AS 'commthumbs'
        FROM fixreply
        GROUP BY userID) d ON d.userID = user.userID

    LEFT JOIN (
        SELECT 
        userID, SUM(IFNULL(fixThUp,0)-IFNULL(fixThDown,0)) AS 'fixthumbs'
        FROM 
        fix
        GROUP BY userID) e ON e.userID = user.userID

    WHERE user.userID = 2;

【讨论】:

  • 我试过这个,但不幸的是我仍然收到一个空值
  • 鉴于sql查询应该可以工作,请分享示例数据进行测试
  • 我刚刚注意到您也在第一个 SELECT 语句中将 IFNULL 添加到 SUM 中,所以我尝试了它并且它有效。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多