0

我想使用逗号分隔的 ID 字符串作为同一查询的输入。

IE:

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 子句的子查询中使用该字符串。

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

谢谢!

4

1 回答 1

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

请注意,函数返回的字符串的长度是有限制的(变量的设置和变量)。如果超出限制,MySQL 不会发出任何错误或警告,它会成功完成,返回一个被截断为最大允许长度的字符串。GROUP_CONCATgroup_concat_max_lenmax_allowed_packet

完全不清楚为什么需要子查询,或者为什么需要检查id列的值是否是函数返回的 id 的“列表”中包含的值之一GROUP_CONCAT。(也许规范中有一些我不理解的东西。)

于 2014-10-22T22:53:55.707 回答