MySQL 看到的是一个字符串值。即使字符串包含逗号,它也不会将该值解释为值列表。
让我们通过一个例子来解释这一点:
SET @bar = 'fee,fi,fo,fum';
SELECT * FROM mytable t WHERE t.foo IN (@bar) ;
这相当于
SELECT * FROM mytable t WHERE t.foo = 'fee,fi,fo,fum'
MySQL 将被@bar
视为一个单一的值。它包含一个或多个逗号并不重要,它只是一个字符串文字;它不会被解释为 SQL 文本。这些逗号只是字符串中的字符。
解决此限制的一种方法是使用“动态 SQL”,它允许您将任意字符串作为 SQL 语句执行。您可以将所需的任何文本构造/连接到变量中,然后像执行 SQL 语句一样执行变量的内容(在 MySQL 存储过程中。您的用例需要多个语句。但要非常小心方法,因为这可能会向一些恶意的 SQL 注入漏洞打开代码。)我不打算给出一个例子,因为我不认为你试图解决的问题需要这种复杂程度。
看起来问题中的查询正在尝试返回与此等效的结果:
SELECT GROUP_CONCAT(DISTINCT t.id) AS `ID String`
, FORMAT(SUM(t.quantity),0) AS `Quantity`
FROM `My Table` t
WHERE t.id IS NOT NULL
请注意,函数返回的字符串的长度是有限制的(变量的设置和变量)。如果超出限制,MySQL 不会发出任何错误或警告,它会成功完成,返回一个被截断为最大允许长度的字符串。GROUP_CONCAT
group_concat_max_len
max_allowed_packet
完全不清楚为什么需要子查询,或者为什么需要检查id
列的值是否是函数返回的 id 的“列表”中包含的值之一GROUP_CONCAT
。(也许规范中有一些我不理解的东西。)