【问题标题】:MySQL Left Join with SUM and Where clause returning NullMySQL Left Join with SUM 和 Where 子句返回 Null
【发布时间】:2014-02-28 11:43:29
【问题描述】:

我有一个问题,

SELECT id, name, cc, total FROM goods gd 
LEFT JOIN (SELECT count(*) as cc, status, pid, SUM(number) as total FROM prices)pr 
ON pr.pid = gd.id AND pr.status = 0 WHERE gd.id=20

当我在本地服务器上运行此查询时,如果获取正确,但在我的远程服务器上,cc 和 total 返回 null。

请问您知道原因吗? 注意:如果我删除了 count(*) 和 SUM(number) 它返回多行,我希望 Left join 得到第二个表中的总匹配和数字总和。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    这是您的查询:

    SELECT id, name, cc, total
    FROM goods gd LEFT JOIN
         (SELECT count(*) as cc, status, pid, SUM(number) as total
          FROM prices
         ) pr 
         ON pr.pid = gd.id AND pr.status = 0
    WHERE gd.id=20;
    

    子查询正在使用 MySQL (mis) 功能,该功能允许您在 select 中包含不在 group by 中且不在聚合列中的列,例如 pid。 MySQL documentation 非常明确地指出,此类列的值来自任意匹配记录,并且仅当列的所有值在组中相同时才应使用此功能。

    发生的情况是,您服务器上的任意列的值为 20。巧合的是,在您的本地服务器上,它确实有。

    status也有问题,所以逻辑也应该不稳定。

    你想要status = 0这样的总和吗?

    SELECT gd.id, gd.name, pr.cc, pr.total
    FROM goods gd LEFT JOIN
         (SELECT count(*) as cc, status, pid, SUM(number) as total
          FROM prices
          WHERE status = 0
          GROUP BY pid
         ) pr 
         ON pr.pid = gd.id
    WHERE gd.id = 20;
    

    或者,您是否只想匹配status 始终等于0 的记录?

    SELECT gd.id, gd.name, pr.cc, pr.total
    FROM goods gd LEFT JOIN
         (SELECT count(*) as cc, status, pid, SUM(number) as total
          FROM prices
          GROUP BY pid
          HAVING min(status) = 0 and max(status) = 0
         ) pr 
         ON pr.pid = gd.id
    WHERE gd.id = 20;
    

    【讨论】:

    • 感谢@Gordon-Linoff 提供全面的答案,本来会选择您的答案,但 echo_Me 的答案排在第一位。再次感谢。
    • @andychukse 。 . .作者有权选择他们认为最好的任何答案。您的问题是:“请对原因有任何想法?”,而不是“我该如何解决这个问题”。另外,echo_me 的回答没有处理status 的问题,你会发现这是一个挥之不去的问题。
    • 我刚刚注意到你指出的状态问题,我会更新你的答案,因为它会更好。谢谢一百万
    【解决方案2】:

    您必须在联合查询中添加group by pid

    SELECT id, name, cc, total FROM goods gd 
    LEFT JOIN (SELECT count(*) as cc, status, pid, SUM(number) as total 
               FROM prices group by pid)pr 
    ON pr.pid = gd.id AND pr.status = 0 
    WHERE gd.id=20
    

    【讨论】:

    • 对不起,我仍然有 Sum(number) 的问题,只有在 status=0 @Glordon-Linoff 回答下面解决了这个问题。谢谢
    • 你可以在 where 子句中传递 pr.status = 0 而不是在 ON 子句中传递beeing。
    猜你喜欢
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多