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
単一の値として認識します。1 つ以上のカンマが含まれていてもかまいません。これは単なる文字列リテラルです。SQL テキストとして解釈されません。これらのコンマは、文字列内の単なる文字です。
この制限に対する回避策の 1 つは、"動的 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 の「リスト」に含まれる値の 1 つであるかどうかを確認する必要がある理由は、まったく明確ではありませんGROUP_CONCAT
。(たぶん、仕様に私が理解していない何かがあります。)