Этот вопрос следует из набора результатов соединения MYSQL, стертых результаты во время IN() в предложении where?
Итак, короткая версия вопроса. Как превратить строку, возвращаемую GROUP_CONCAT, в список выражений, разделенных запятыми, который IN() будет рассматривать как список из нескольких элементов для циклического просмотра?
Н.Б. Документы MySQL ссылаются на «(запятая, разделенные, списки)», используемые IN() как на «списки выражений», и, что интересно, страницы в IN() кажутся более или менее единственными страницами в документах MySQL для когда-либо обращаться к спискам выражений. Поэтому я не уверен, что функции, предназначенные для создания массивов или временных таблиц, будут здесь полезны.
Длинная версия вопроса, основанная на примере: из базы данных с двумя таблицами, например:
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 обрабатывается как список, так что для Боба это будет эквивалентно:
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...)?
(примечание: эта логика работает без И, применяя к первому символу строки. например.
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)
GROUP_CONCAT()
во всехFIND_IN_SET()
. Вы можете простоSELECT GROUP_CONCAT(tag.tag_id) AS tags_list
, а затемHAVING FIND_IN_SET(20, tags_list)
- person Treffynnon   schedule 03.03.2011