从LEFT JOIN设置NULL列的默认值并使用WHERE过滤

时间:2011-12-16 17:44:48

标签: mysql sql left-join

我有一个项目表,我有一个单独的表格,其中包含每个项目的个别购买。并非每件商品都已购买。我正在选择购买计数并将其与项目表一起加入,其声明类似于以下内容:

SELECT items.name, purchases_count
FROM `items` 
    LEFT JOIN (SELECT sales.item_name, SUM(unit_sales) AS purchases_count 
        FROM sales GROUP BY item_name) sales ON sales.item_name = items.uid

这导致数据类似于:

+------+-----------------+
| name | purchases_count |
|------+-----------------+
| Shoe | 12              |
| Belt | NULL            |
+------+-----------------+

当我想在purchases_count上过滤此结果时,我的问题就出现了。如果我使用WHERE purchases_count < 10或类似的内容,则根本没有销售记录的项目(即值为NULL的项目)将从搜索中排除。

我尝试使用COALESCE(purchases_count,0) AS purchases_countNULL记录正确设置为0,但在使用WHERE时仍未显示。我怀疑COALESCE之后WHERE正在发生WHERE

我希望能够使用NULL过滤此数字,并在可能的情况下包含{{1}}个结果(作为零)。有什么建议吗?

6 个答案:

答案 0 :(得分:8)

别名通常不适用于WHERE条款 - 请COALESCE(purchases_count,0) AS purchases_count_2where purchases_count_2 < 10一起查看我的意思。

where COALESCE(purchases_count,0) < 10应该有用。

答案 1 :(得分:2)

不是在单独的查询中计算购买,而是仅对主查询进行分组。要过滤计数,请将其放在having caluse:

select i.name, coalesce(sum(s.unit_sales), 0) as purchases_count
from items i
left join sales s on s.item_name = i.uid
group by i.name
having purchases_count < 10

答案 2 :(得分:1)

怎么样:

WHERE (purchases_count < 10) OR (purchases_count IS NULL)

当然,您仍然会留下空值,但您仍然可以尝试使用COALESCE选项将这些空值转换为零以供以后使用。

答案 3 :(得分:0)

COALESCE是正确的方法,但您不应该使用WHERE,请尝试: -

HAVING purchases_count<=10

答案 4 :(得分:0)

所以,你可以像这样添加一个where子句:

 WHERE purchases_count < 10 OR purchases_count is NULL

答案 5 :(得分:0)

你试试这个

SELECT items.name, IFNULL(purchases_count,0)
FROM `items` 
LEFT JOIN (
            SELECT item_name, SUM(unit_sales) AS purchases_count 
            FROM sales GROUP BY item_name
           ) s ON s.item_name = items.uid
GROUP BY items.name
HAVING purchases_count >10