0

当我执行下面的查询时,它返回 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);” ...有用。有什么想法吗?

4

2 回答 2

0

如果子查询只返回 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 子句不起作用。

于 2014-04-30T22:08:52.557 回答
0

按照惯例,我通常建议避免使用逗号连接语法和 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);

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

于 2014-04-30T22:10:06.073 回答