我想使用逗号分隔的ID字符串作为同一查询的输入。
即:
Set @IDs := '';
Select @IDs := CAST(GROUP_CONCAT(DISTINCT CAST(`id` as CHAR)) AS Char) AS 'ID String',
(
Select FORMAT(Sum(`Quantity`),0)
from 'My Table'
Where `ID` IN (@IDs)
) As 'Quantity'
From `My Table`
实际查询要复杂得多,但我需要实现的是将逗号分隔的ID字符串分配给变量,并在带有IN子句的子查询中使用该字符串。
以上不起作用。我将不胜感激任何反馈。
谢谢!
答案 0 :(得分:0)
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
请注意GROUP_CONCAT
函数返回的字符串长度(group_concat_max_len
变量的设置和{{}的限制 1}}变量)。如果超出限制,MySQL不会发出任何错误或警告,它会成功完成,并将截断的字符串返回到允许的最大长度。
根本不清楚为什么需要子查询,或者为什么您需要检查max_allowed_packet
列的值是否是&#34中包含的值之一;列表"由id
函数返回的id。 (也许规范中有些东西我不理解。)