作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个查询遇到问题,
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
当我在本地服务器上运行此查询时,如果提取正确,但在我的远程服务器上,抄送和总计返回 null。
请问您知道原因吗?注意:如果我删除了 count(*) 和 SUM(number) 它会返回多行,我希望 Left join 获得第二个表中的总匹配数和数字总和。
最佳答案
这是您的查询:
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 中的列,例如
并且不在聚合列中。 MySQL documentation非常明确的是,此类列的值来自任意匹配的记录,并且仅当该列的所有值在组中都相同时才应使用此功能。pid
发生的情况是,您服务器上的任意列的值不为 20。巧合的是,在您的本地服务器上,它的值为 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
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;
关于MySQL Left Join 与 SUM 和Where 子句返回 Null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22094244/
我是一名优秀的程序员,十分优秀!