MYSQL 左连接函数结果缺少行

viv*_*ill 1 mysql left-join

我有两张桌子。A 带有物料,(库存主清单) B 带有物料、日期和销售额(销售表)

我有:

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))
Run Code Online (Sandbox Code Playgroud)

这并没有列出 A 中的所有项目我知道在选定的日期范围内,A 中的某些项目在 B 上没有任何销售,因此它不存在。有没有办法可以使用 join 函数将它们列为零?

我有这个:

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))
Run Code Online (Sandbox Code Playgroud)

这有效。但不知何故,这个非常慢(比顶部的不完整连接函数慢 3 或 4 倍)

谢谢你。

Bar*_*mar 6

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

沽上限制B.date了中ON条款,而不是WHERE条款:LEFT JOIN sales AS B ON A.item = B.item AND B.date BETWEEN %s AND %s。这是一般规则的例外,即ON子句应该只包含被连接的表之间的比较。