Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] Zapętlone zapytanai
Forum PHP.pl > Forum > PHP
Riggs
Witam!
Mam strukturę danych: Poziom1->Poziom2->Poziom3->Poziom4, gdzie Poziom1 jest korzeniem i jednocześnie rodzicem Poziom2 itd. Generalnie chodzi o definiowanie grup nadrzędnych. W każdym rekordzie, nie zależnie od tego do którego poziomu należy jest pole np A, które przyjmuje wartości 'TAK', 'NIE'. Jeśli wartość to 'TAK' to wartość w raporcie ma być pobrana z poziomu wyżej. Jeśli jest tylko jeden poziom to nie mam problemów, robię "SELECT B FROM tabela WHERE id=r['grupa_nadrzędna']" (poglądowo: w rekordzie r przechowuje id grupy nadrzędnej i chcę wziąść pole B z poziomu wyżej). Jeśli natomiast na poziomie wyżej jest ustawione pole A na 'TAK' to już nie potrafię zapętlić PHP żeby brał wartości z poziomu wyżej aż nie natafi na A == 'NIE'.

Proszę o pomoc.
maxserwer
To jest rzeczywiście jakieś zapętlone pytanie, bo nic nie cykam, może jaśniej to pomogę smile.gif
Riggs
Mamy tabelę np. LOKALIZACJE. Pola to: ID, NAZWA, ADRES, ADRES_NAD, LOKAL_NAD.

W PHP ustawiamy do wyboru 2 możliwości dla pola Adres_NAD: TAK lub NIE. Jeśli tak to ma pobierać adres z pomieszczenia o ID przechowywanym w LOKAL_NAD (rekord z tej samej tabeli). Jeśli natomiast to pomieszczenie ma ustawione ADRES_NAD na tak to szukamy jego rodzica aż nie natrafimy na ADRES_NAD==NIE i wtedy pobieramy wartość pola ADRES.

Teraz chyba będzie to bardziej zrozumiałem
UDAT
Jeśli chcesz zrobić to czystym zapytaniem SQL'owym to raczej nie uda ci się.

Możesz stworzyć odpowiednią procedurę składowaną, wykorzystać taką strukturkę i ją zmodyfikować, albo wybłagać developerów MySQL'a o zaimplementowanie CONNECT BY z ORACLE'a(kiedyś słyszałem, że mieli to zaimplementować, ale do tej pory brak)
Riggs
No SQL tu mi nic nie pomoże. Trzeba to zapętlić w PHP, ale moja koncepcja nie działa.

  1. <?php
  2. $r = mysql_query('SELECT * FROM LOKALIZACJE WHERE id=1');
  3. $row = mysql_fetch_array($r);
  4.  
  5. /*Tu ciąg operacji przetwarzania poszczególnych pól.*/
  6.  
  7. if($row['ADRES_NAD'] == 'NIE')
  8. {
  9. echo 'Adres to: '.$row['ADRES'].'';
  10. }else
  11. {
  12. /*Tu musi być pętla której nie potrafie skonstruować - tzn dla jednego poziomu wyżej działa ale dalej już nie*/
  13. $ad = mysql_query('SELECT id, ADRES, ADRES_NAD FROM LOKALIZACJE WHERE id=$row['LOKAL_NAD']');
  14. $r1 = mysql_fetch_array($ad);
  15. while($r1['ADRES_NAD'] == 'TAK')
  16. {
  17. $ad = mysql_query('SELECT id, ADRES, ADRES_NAD FROM LOKALIZACJE WHERE id=$row['LOKAL_NAD']');
  18. $r1 = mysql_fetch_array($ad);
  19. }
  20. /*W teorii ta pętla powinna przetwarzać tak długo aż natrafi na pomieszczenie mające swój własny adres*/
  21. }
  22.  
  23. ?>


Pisane od ręki więc mogą być literówki, chodzi tu tylko o koncepcję.
UDAT
W linii 17. powinno być $r1 zamiast $row, poza tym złe ciapki (ale pewnie to wina forum )
Riggs
No to zapytanie które podałem nie działa.

Błąd:
Fatal error: Maximum execution time of 60 seconds exceeded in ...

Coś jest nie tak z pętlą :/

Edit:
Błąd znaleziony. Pętla była nieskończona bo cały czas szukałem w obrębie jednego wiersza bo było id=$r1['id'] a powinno być LOKAL_NAD=$r1['id'].

Teraz śmiga wysmienicie. Dzięki za pomoc.
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.