MYSQL左连接函数结果缺少行

时间:2015-11-05 21:59:13

标签: 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))

这并未列出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倍)

谢谢。

2 个答案:

答案 0 :(得分:3)

当您使用 <hundreds> <hundred> <style>test</style> <label>label</label> <descriptiontext>something description</descriptiontext> <viewalllink>viewurl</viewalllink> <viewalllabel>viewurl</viewalllabel> <contendors> <contendor> <locid>810</locid> </contendor> <contendors> </hundred> </hundreds> 时,如果表LEFT JOIN中没有匹配的行,则这些列将为B,因此NULL将始终为false。

将限制放在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子句应该只包含要连接的表之间的比较。

答案 1 :(得分:0)

由于您正在执行left join,因此B中的某些日期将为NULL。如果您希望所有结果都在日期范围AND结果中而B中没有关联记录,则需要考虑到这一点:

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