MYSQL 左连接函数结果缺少行

MYSQL left join function results missing rows

我有两张桌子。 A with item,(库存主清单) B 包含商品、日期和销售额(销售额 sheet)

我有:

cursor.execute(
    "SELECT A.item, sum(B.qty) \
    FROM A \
    LEFT JOIN sales on A.item = B.item \
    WHERE B.date BETWEEN %s AND %s\
    GROUP BY A.item", (gr2014start, gr2014end))

这没有列出 A 中的所有项目 我了解到在选定的日期范围内,A 中的某些商品在 B 上没有任何销售,因此不存在。 有没有一种方法可以使用连接函数将它们列为零?

我有这个:

cursor.execute("SELECT A.item, \
    (SELECT COALESCE(sum(qty),0) From B \
    WHERE (A.item = B.item) \
    AND (B.date BETWEEN %s AND %s)) as 'Qty' \
    FROM A", (gr2014start, gr2014end))

这行得通。但是不知何故这个非常慢(比上面不完整的连接函数慢 3 或 4 倍)

谢谢。

由于您正在执行 left join B 中的某些日期将为 NULL。如果您想要日期范围内的所有结果和 B 中没有关联记录的结果,您需要考虑到这一点:

WHERE B.date IS NULL OR B.date BETWEEN %s AND %s

当您使用 LEFT JOIN 时,如果 table B 中没有匹配的行,这些列将为 NULL,因此 B.date BETWEEN %s AND %s 将始终是假的。

B.date 的限制放在 ON 子句中,而不是 WHERE 子句中:LEFT JOIN sales AS B ON A.item = B.item AND B.date BETWEEN %s AND %s。这是 ON 子句应仅包含要连接的 table 之间的比较的一般规则的例外情况。