2012-08-07 2 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) 

это работает так же, как и первый запрос для объединения идентификаторов состояния, сгруппированных, однако они возвращают NULL как итоговые

+0

Связанный: http://stackoverflow.com/questions/4155873/find-in-set-vs-in –

ответ

3

GROUP_CONCAT() возвращает строку, которая является единственным значением. Предложение IN(), хотя оно принимает список значений, разделенных запятыми, не будет принимать только любую строку, которую вы даете, а затем разобрать отдельные значения.

Он обрабатывает результат GROUP_CONCAT() в виде одной строки блока, который может быть членом многих других строк в списке через запятую, но ни одна строка не соответствует order_status_id = '1,3,5,6', которая является то, что, в конечном счете видит СУБД.

Если вы хотите использовать запрос для этого предложения 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 

... затем добавить необходимые функции агрегата.

Смежные вопросы