2012-08-07 90 views
2

我使用MySQL的函數GROUP_CONCAT當今天遇到了一個很奇怪的問題:奇怪GROUP_CONCAT行爲在MySQL

我有以下查詢:

SELECT SUM(total) FROM order WHERE customer_id='X' AND order_status_id IN ((SELECT GROUP_CONCAT(order_status_id SEPARATOR ',') FROM order_status WHERE profit='1')) 

但返回NULLL,但是:

SELECT SUM(total) FROM order WHERE customer_id='X' AND order_status_id IN (1,2,3,4,5,6,7,8) 

此工作以及第一個查詢來concat狀態id的分組但是他們返回NULL作爲總數

+0

相關:http://stackoverflow.com/questions/4155873/find-in-set-vs-in – 2012-08-07 14:04:57

回答

3

GROUP_CONCAT()返回一個字符串,它是一個單一值。 IN()子句儘管接受以逗號分隔的值列表,但不會僅使用任何字符串,然後解析出各個值。

它將GROUP_CONCAT()的結果視爲單個字符串單元,它可能是逗號分隔列表中許多其他字符串的成員,但沒有行匹配order_status_id = '1,3,5,6',這是RDBMS最終看到的。

如果您想對該IN()子句使用查詢,請使用子查詢。 IN()子句知道如何處理由子查詢返回的行集,並將適當地對待它。

SELECT 
    SUM(total) 
FROM order 
WHERE 
    customer_id='X' 
    AND order_status_id IN (
    SELECT order_status_id FROM order_status WHERE profit = '1' 
); 
1

關於你的問題。嘗試使用FIND_IN_SET函數 -

SELECT 
    SUM(total) 
FROM 
    `order` 
WHERE 
    customer_id='X' AND 
    FIND_IN_SET(
    order_status_id, 
    (SELECT GROUP_CONCAT(order_status_id) FROM order_status WHERE profit='1') 
) 

我建議你使用JOIN子句。例如 -

SELECT o.* FROM `order` o 
    JOIN order_status os 
    ON o.order_status_id = os.order_status_id 
WHERE o.customer_id='X' AND os.profit = 1 

...然後添加您需要的聚合函數。