今天使用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
答案 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
...然后添加您需要的聚合函数。