我有一个项目表,我有一个单独的表格,其中包含每个项目的个别购买。并非每件商品都已购买。我正在选择购买计数并将其与项目表一起加入,其声明类似于以下内容:
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_count
将NULL
记录正确设置为0,但在使用WHERE
时仍未显示。我怀疑COALESCE
之后WHERE
正在发生WHERE
。
我希望能够使用NULL
过滤此数字,并在可能的情况下包含{{1}}个结果(作为零)。有什么建议吗?
答案 0 :(得分:8)
别名通常不适用于WHERE
条款 - 请COALESCE(purchases_count,0) AS purchases_count_2
与where 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