当我执行下面的查询时,它返回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);" ...有用。有什么想法吗?
答案 0 :(得分: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子句不起作用。
答案 1 :(得分: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);
这将为您提供所有其他不匹配的交易记录和空值,以便您可以更准确地检查数据。如果您已更正语法,请根据需要将INFT替换为INNER。