MySQL中奇怪的GROUP_CONCAT行为

时间:2012-08-07 14:01:31

标签: mysql group-concat

今天使用MySQL函数GROUP_CONCAT时遇到了一个非常奇怪的问题:

我有以下查询:

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)

这与第一个连接状态ID的查询一样有效,但是它们按总计返回NULL

2 个答案:

答案 0 :(得分: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 :(得分: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

...然后添加您需要的聚合函数。