この質問は、MYSQL結合結果セットのWhere句のIN()中にワイプされた結果に続きますか?
だから、質問の短いバージョン。GROUP_CONCATによって返された文字列を、IN()がループする複数の項目のリストとして扱うコンマ区切りの式リストに変換するにはどうすればよいですか?
注意:MySQLドキュメントは、IN()が「式リスト」として使用する「(コンマ、区切り、リスト)」を参照しているようです。興味深いことに、IN()のページは多かれ少なかれMySQLドキュメントの唯一のページのようです。式リストを参照します。したがって、配列または一時テーブルを作成することを目的とした関数がここで使用されるかどうかはわかりません。
質問の長い例ベースのバージョン:次のような2テーブルDBから:
SELECT id, name, GROUP_CONCAT(tag_id) FROM person INNER JOIN tag ON person.id = tag.person_id GROUP BY person.id;
+----+------+----------------------+
| id | name | GROUP_CONCAT(tag_id) |
+----+------+----------------------+
| 1 | Bob | 1,2 |
| 2 | Jill | 2,3 |
+----+------+----------------------+
文字列を使用するため、これを(1 = X)AND(2 = X)..と論理的に等価として扱うにはどうすればよいですか。
SELECT name, GROUP_CONCAT(tag.tag_id) FROM person LEFT JOIN tag ON person.id = tag.person_id
GROUP BY person.id HAVING ( ( 1 IN (GROUP_CONCAT(tag.tag_id) ) ) AND ( 2 IN (GROUP_CONCAT(tag.tag_id) ) ) );
Empty set (0.01 sec)
... GROUP_CONCATの結果がリストとして扱われるものに変換されるため、Bobの場合は次のようになります。
SELECT name, GROUP_CONCAT(tag.tag_id) FROM person INNER JOIN tag ON person.id = tag.person_id AND person.id = 1
GROUP BY person.id HAVING ( ( 1 IN (1,2) ) AND ( 2 IN (1,2) ) );
+------+--------------------------+
| name | GROUP_CONCAT(tag.tag_id) |
+------+--------------------------+
| Bob | 1,2 |
+------+--------------------------+
1 row in set (0.00 sec)
...そしてジルにとって、それは以下と同等です:
SELECT name, GROUP_CONCAT(tag.tag_id) FROM person INNER JOIN tag ON person.id = tag.person_id AND person.id = 2
GROUP BY person.id HAVING ( ( 1 IN (2,3) ) AND ( 2 IN (2,3) ) );
Empty set (0.00 sec)
...したがって、全体的な結果は、HAVING COUNT(DISTINCT ...)を使用しないすべてのリストされたタグを必要とする排他的な検索句になりますか?
(注:このロジックはANDなしで機能し、文字列の最初の文字に適用されます。例:
SELECT name, GROUP_CONCAT(tag.tag_id) FROM person LEFT JOIN tag ON person.id = tag.person_id
GROUP BY person.id HAVING ( ( 2 IN (GROUP_CONCAT(tag.tag_id) ) ) );
+------+--------------------------+
| name | GROUP_CONCAT(tag.tag_id) |
+------+--------------------------+
| Jill | 2,3 |
+------+--------------------------+
1 row in set (0.00 sec)