Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL] Zapytania wysyłane oddzielnie zwracają dobre dane, wysłane razem, dają 0 rekordów
radziel
post 11.08.2008, 14:40:50
Post #1





Grupa: Zarejestrowani
Postów: 103
Pomógł: 0
Dołączył: 25.04.2003
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


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.


--------------------
r.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
nospor
post 11.08.2008, 14:44:41
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
radziel
post 11.08.2008, 14:49:27
Post #3





Grupa: Zarejestrowani
Postów: 103
Pomógł: 0
Dołączył: 25.04.2003
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


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


--------------------
r.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 17:18