do tej pory zajmowałem się prostymi zapytaniami, ale aktualny projekt z uwagi na strukturę drzewa (drzewo IP) wymusił zgłębienie tajników składni SQL.
Analizując dokumentację MySQL'a stworzyłem takie oto zapytanie:
SELECT GROUP_CONCAT( CAST( id AS CHAR ) ORDER BY CAST( id AS CHAR ) SEPARATOR ', ' ) FROM `system_structure` WHERE ip LIKE CONCAT( ( SELECT ip FROM `system_structure` WHERE id = 4 ), '%' ) ORDER BY ip
zwraca ono w jednym wierszu poddzielane przecinkiem wszystkie id kategorii, które są głebiej niż zadeklarowana w zapytaniu (o id 4)
W odpowiedzi dostaję to czego się spodziewam:
"20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 4"
Teraz drugie zapytanie, które pobiera wszystkie produkty przypisane do tych kategorii
SELECT p.name FROM `system_relations` AS r, `system_programs` AS p, `system_structure` AS s WHERE r.category_id IN ( 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 4 ) AND p.program_id = r.program_id AND r.category_id = s.id
W rezultacie dostaję rekordy z nazwami produktów. Niestety problem zaczyna się z chwilą połaczenia tych dwóch zapytań:
SELECT p.name FROM `system_relations` AS r, `system_programs` AS p, `system_structure` AS s WHERE r.category_id IN ( SELECT GROUP_CONCAT( CAST( id AS CHAR ) ORDER BY CAST( id AS CHAR ) SEPARATOR ', ' ) FROM `system_structure` WHERE ip LIKE CONCAT( ( SELECT ip FROM `system_structure` WHERE id = 4 ), '%' ) ORDER BY ip ) AND p.program_id = r.program_id AND r.category_id = s.id
Dostaję 0 rekordów. Dlaczego? Nie mogę znaleźć przyczyny tego stanu rzeczy. Według mnie powinienem dostać identyczną odpowiedź. Oczywiście mogę wysłać te zapytania oddzielnie i obrabiać wszystko w PHP, ale wolałbym jednym zapytaniem załatwić "konwersję" danych po stronie serwera mysql.
Jakieś sugestie? Będę wdzięczny.