在子查询中使用来自查询的逗号分隔字符串

时间:2014-10-22 21:20:57

标签: mysql variables subquery in-subquery

我想使用逗号分隔的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子句的子查询中使用该字符串。

以上不起作用。我将不胜感激任何反馈。

谢谢!

1 个答案:

答案 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。 (也许规范中有些东西我不理解。)