2014-02-28 100 views
0

我有一个查询时遇到的问题,MySQL的左连接用SUM和Where子句返回NULL

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和总量返回null。

请问原因? 注意:如果我删除了count(*)和SUM(number)它返回多行,我想让左连接在第二个表中获得总匹配和数字总和。

回答

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列,如pid不在的group by并不在汇总列中。 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; 
+0

谢谢@ Gordon-Linoff的综合答案,会选择你的答案,但echo_Me的答案首先出现。再次感谢。 – andychukse

+0

@andychukse。 。 。作者有权选择他们认为最好的答案。你的问题是:“请问原因?”,这不是“我该如何解决这个问题”。另外,echo_me的回答并不处理'status'的问题,你会发现这是一个挥之不去的问题。 –

+0

我刚刚注意到你指出的状态问题,我会更新你的答案。太感谢了 – andychukse

0

您必须在已加入的查询中添加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 
+0

感谢加入GROUP BY pid解决了这个问题。 – andychukse

+0

你欢迎:)我想知道你去了哪里:)。 –

+0

对不起,我仍然有总和(数字)的问题,只有当状态= 0 @下面的Glordon-Linoff答案解决了这个问题。谢谢 – andychukse