To pytanie wynika z MYSQL join results set wiped results during IN() in where clause?podzielić ciąg MYSQL z GROUP_CONCAT się w (array, jak, wyrażenie, liście), że w() może zrozumieć
Tak, krótką wersję pytaniem. Jak zmienić ciąg zwracany przez GROUP_CONCAT na listę wyrażeń rozdzielonych przecinkami, która IN() będzie traktować jako listę wielu elementów do zapętlenia się?
N.B. Dokumenty MySQL wydają się odnosić do "(przecinek, oddzielne, listy)" używanych przez IN() jako "listy wyrażeń", i co ciekawe strony na IN() wydają się być mniej więcej jedynymi stronami w dokumentach MySQL, kiedykolwiek odnosić się do list wyrażeń. Więc nie jestem pewien, czy funkcje przeznaczone do tworzenia tablic lub tabel tymczasowych będą tutaj przydatne.
wersja Długi przykład oparte na pytanie: Z 2-tabeli DB tak:
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 |
+----+------+----------------------+
Jak mogę włączyć ten, który ponieważ wykorzystuje ciąg jest traktowana jako logiczny odpowiednik (1 = X) i (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)
... w coś, w których wynik GROUP_CONCAT jest traktowany jako listy, tak że dla Boba, byłoby równoznaczne z:
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)
... i Jill, byłoby równoznaczne z:
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)
... więc ogólny wynik byłby wyłącznym klauzula wyszukiwania wymagające wszystkie wymienione znaczniki, które nie korzystają HAVING COUNT (ODRĘBNY ...) ?
(uwaga: Ta logika działa bez I, stosując do pierwszego znaku łańcucha np
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)
To jest ładne, ale warto zauważyć, że nie trzeba robić 'GROUP_CONCAT()' we wszystkich 'FIND_IN_SET()'. Możesz po prostu "SELECT GROUP_CONCAT (tag.tag_id) AS tag_list", a następnie 'HAVING FIND_IN_SET (20, tags_list)' – Treffynnon