2014-11-05 96 views
2

我是新手到MySQL ....它可能看轉儲問題....但我一直在嘗試這從3小時...在這裏,我正在嘗試做....IFNULL與IN語句與MySQL

SELECT 
    MERCHANT_ID, 
    IFNULL(COUNT(SUBSCRIBE_ID),0) 
FROM SUBSCRIBE_TABLE 
WHERE 
    MERCHANT_ID IS NULL OR 
    MERCHANT_ID IN(1000000000066,1000000000104,1000000000103,1000000000105) 
GROUP BY MERCHANT_ID 
ORDER BY 
    FIND_IN_SET(MERCHANT_ID,'1000000000066,1000000000104,1000000000103,1000000000105'); 

,輸出爲...

+------------------+---------------------------------+ 
| MERCHANT_ID  | IFNULL(COUNT(SUBSCRIBE_ID),0) | 
+------------------+---------------------------------+ 
| 1000000000066 |        2 | 
| 1000000000103 |        1 | 
+------------------+---------------------------------+ 

但我在下面的方式期待......

+------------------+---------------------------------+ 
| MERCHANT_ID  | IFNULL(COUNT(SUBSCRIBE_ID),0) | 
+------------------+---------------------------------+ 
| 1000000000066 |        2 | 
| 1000000000104 |        0 | 
| 1000000000103 |        1 | 
| 1000000000105 |        0 | 
+------------------+---------------------------------+ 

我嘗試添加MERCHANT_ID IS NULL ...但不能得到結果與默認值... :(

回答

1

你只會得到實際上在SUBSCRIBE_TABLE記錄。如果您想獲取所有ID的記錄,則必須首先使用這些值「創建臨時表」(或者在此案例中使用帶有UNION的子查詢),然後將結果加入到它中。

您的查詢看起來是這樣的:

SELECT 
    merchant_id, 
    COUNT(subscribe_id) 
FROM 
    (SELECT 1000000000066 AS merchant_id, 1 AS SortKey 
    UNION ALL 
    SELECT 1000000000104 AS merchant_id, 2 AS SortKey 
    UNION ALL 
    SELECT 1000000000103 AS merchant_id, 3 AS SortKey 
    UNION ALL 
    SELECT 1000000000105 AS merchant_id, 4 AS SortKey 
) AS temp 
LEFT JOIN subscribe_table USING (merchant_id) 
GROUP BY merchant_id 
ORDER BY SortKey ASC 

我換成你FIND_IN_SET同時在子查詢列SortKeyCOUNT只會計算非空行,如果找不到,則返回0。你不需要圍繞它的IFNULL

如果你有更多的4 merchant_id s你可能想要考慮用臨時表做同樣的事情。請看這裏的例子:
Mysql: Create inline table within select statement?