这里是你的查询:
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;
谢谢@ Gordon-Linoff的综合答案,会选择你的答案,但echo_Me的答案首先出现。再次感谢。 – andychukse
@andychukse。 。 。作者有权选择他们认为最好的答案。你的问题是:“请问原因?”,这不是“我该如何解决这个问题”。另外,echo_me的回答并不处理'status'的问题,你会发现这是一个挥之不去的问题。 –
我刚刚注意到你指出的状态问题,我会更新你的答案。太感谢了 – andychukse