Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Zapytania wysyłane oddzielnie zwracają dobre dane
Forum PHP.pl > Forum > Bazy danych > MySQL
radziel
Witam,
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:

  1. SELECT GROUP_CONCAT( CAST( id AS CHAR ) ORDER BY CAST( id AS CHAR )
  2. SEPARATOR ', ' )
  3. FROM `system_structure` WHERE ip LIKE CONCAT( (
  4. SELECT ip
  5. FROM `system_structure` WHERE id = 4
  6. ), '%' )
  7. 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

  1. SELECT p.name
  2. FROM `system_relations` AS r, `system_programs` AS p, `system_structure` AS s
  3. 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ń:
  1. SELECT p.name
  2. FROM `system_relations` AS r, `system_programs` AS p, `system_structure` AS s
  3. WHERE r.category_id
  4. IN ( SELECT GROUP_CONCAT( CAST( id AS CHAR ) ORDER BY CAST( id AS CHAR )
  5. SEPARATOR ', ' )
  6. FROM `system_structure` WHERE ip LIKE CONCAT( (
  7.  
  8. SELECT ip
  9. FROM `system_structure` WHERE id = 4
  10. ), '%' )
  11. 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.
nospor
podzapytanie uzywane do IN nie moze zwracac tekstu skladającego sie z id oddzielonych przecinkiem. Zapytanie to musi zwrocic po kolei wszystkie te ID jako nowe rekordy. Wowczas dopiero będzie ci to dzialac z IN.

To ze ty do IN bez podzapytania dajesz 1,2,3,4.... to zupelnie inna bajka
radziel
Dzięki, to nawet znacząco uprościło moje zapytanie.

Sądziłem właśnie że do IN, muszę podać dane dokładnie w takiej samej formie jak to robię ręcznę. A jednak nie smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.