2

我今天在使用 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 作为总数

4

2 回答 2

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'
  );
于 2012-08-07T14:04:00.017 回答
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

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

于 2012-08-07T14:08:52.293 回答