2011-12-16 37 views
9

我有一個項目表,我有一個單獨的表,其中包含每個項目的單獨購買。並非每件商品都已購買。我選擇了購買數量,並與項目表類似如下的語句將它:在LEFT JOIN的NULL列上設置默認值並使用WHERE過濾

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結果(如爲零)。有什麼建議麼?

+0

`alias`的左連接表是相同的表名,這是很好的做法? – diEcho 2011-12-16 18:03:14

+0

SQL查詢已被簡化爲只關注問題,實際的SQL與此不同。 – 2011-12-16 18:06:39

回答

7

別名通常不適用於WHERE子句 - 嘗試COALESCE(purchases_count,0) AS purchases_count_2where purchases_count_2 < 10以瞭解我的意思。

where COALESCE(purchases_count,0) < 10應該工作。

+0

使用purchases_count_2將不起作用,它與在正常的purchases_count上使用COALESCE相同的問題 - 它在WHERE子句中無法識別。 `WHERE COALESCE(purchases_count,0)<10`確實有效,但我寧願找到一種不必在此包裹COALESCE的方法。可能現在是最好的選擇,謝謝。 – 2011-12-16 17:57:36

+0

不知道這是否適用於MySQL,但你可以使用子查詢:`select * from(select ... coalesce(purchases_count,0)as purchases_count ...)where purchases_count <10` – wrschneider 2011-12-16 18:03:40

1

如何:

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

,你仍然會留下空值,但你仍然可以嘗試COALESCE選項來把這些空值到零供以後使用。

+0

想法是,我想成爲能夠對這些數字應用任意過濾器,所以我不希望在我尋找purchases_count> 6時返回NULL,例如使用這種情況。 – 2011-12-16 17:55:51

0

COALESCE是正確的做法,但你不應該使用WHERE,嘗試: -

HAVING purchases_count<=10 
0

所以,你可以添加這樣的where子句:

WHERE purchases_count < 10 OR purchases_count is NULL 
0

具有u試試這個

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 
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