Этот вопрос вытекает из MYSQL объединяет набор результатов очистки результатов во время IN () в предложении where?
Итак, краткая версия вопроса.Как превратить строку, возвращаемую GROUP_CONCAT, в список выражений, разделенных запятыми, который IN () будет обрабатывать как список из нескольких элементов для зацикливания?
NB. Документы MySQL, по-видимому, ссылаются на «(запятые, разделенные, списки)», используемые IN (), как «списки выражений», и, что интересно, страницы IN () кажутся более или менеетолько страницы в документах MySQL когда-либо ссылаются на списки выражений.Поэтому я не уверен, будут ли здесь полезны функции, предназначенные для создания массивов или временных таблиц.
Длинная примерная версия вопроса: из БД с 2 таблицами, подобной этой:
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) И (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)
... а для Jill это будет эквивалентно:
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)