繁体   English   中英

MySQL子查询返回空

[英]Mysql subquery returning null

当我执行下面的查询时,它返回NULL。

SELECT SUM(t.coupon_quantity)
FROM transaction t, coupon c, supplier s 
WHERE MONTH(date_entered) = MONTH(CURDATE()) 
AND  YEAR(date_entered) = YEAR(CURDATE()) 
AND t.coupon_id = c.id
AND c.supplier_id = s.id
AND s.id IN (SELECT us.supplier_id FROM user_supplier us WHERE us.user_id = 4);

当我取出最后一行时,它返回记录,但是当我添加它时,我什么也没得到,因此它使我相信这是我的子查询的问题。

当我自己执行子查询时,我得到两个ID(14和15)。 当我将子查询替换为:“ AND s.id IN(14,15);” ...有用。 有什么想法吗?

如果子查询仅返回没有重复的14和15,则以下查询应该工作(将您的where in子句更改为另一个联接)

SELECT SUM(t.coupon_quantity)
FROM transaction t
JOIN coupon c on t.coupon_id = c.id
JOIN supplier s on c.supplier_id = s.id
JOIN user_supplier us on s.id = us.supplier_id and us.user_id = 4
WHERE MONTH(date_entered) = MONTH(CURDATE()) 
AND  YEAR(date_entered) = YEAR(CURDATE())

不幸的是,当子查询自身工作时,我不知道为什么您的IN子句不起作用。

按照惯例,我通常建议避免使用逗号联接语法和INNER JOIN。

试试看,看看你的结果。 他们一定会提供一些洞察力,帮助您了解为何无法获得理想的结果

SELECT SUM(t.coupon_quantity)
FROM transaction t
LEFT JOIN coupon c ON t.coupon_id = c.id
LEFT JOIN supplier s ON c.supplier_id = s.id  -- First glance makes me think it should be t.supplier_id?
WHERE MONTH(date_entered) = MONTH(CURDATE())
  AND YEAR(date_entered) = YEAR(CURDATE())
  AND s.id IN (SELECT us.supplier_id FROM user_supplier us WHERE us.user_id = 4);

这将为您提供所有交易记录和所有不匹配项的空值,因此您可以更准确地检查数据。 更正语法后,请根据需要用INNER替换LEFT。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM