Riggs
10.07.2007, 11:39:24
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
10.07.2007, 12:14:15
To jest rzeczywiście jakieś zapętlone pytanie, bo nic nie cykam, może jaśniej to pomogę
Riggs
10.07.2007, 12:30:16
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
10.07.2007, 13:23:53
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
10.07.2007, 13:40:33
No SQL tu mi nic nie pomoże. Trzeba to zapętlić w PHP, ale moja koncepcja nie działa.
<?php
$r = mysql_query('SELECT * FROM LOKALIZACJE WHERE id=1');
/*Tu ciąg operacji przetwarzania poszczególnych pól.*/
if($row['ADRES_NAD'] == 'NIE')
{
echo 'Adres to: '.$row['ADRES'].''; }else
{
/*Tu musi być pętla której nie potrafie skonstruować - tzn dla jednego poziomu wyżej działa ale dalej już nie*/
$ad = mysql_query('SELECT id, ADRES, ADRES_NAD FROM LOKALIZACJE WHERE id=$row['LOKAL_NAD
']'); while($r1['ADRES_NAD'] == 'TAK')
{
$ad = mysql_query('SELECT id, ADRES, ADRES_NAD FROM LOKALIZACJE WHERE id=$row['LOKAL_NAD
']'); }
/*W teorii ta pętla powinna przetwarzać tak długo aż natrafi na pomieszczenie mające swój własny adres*/
}
?>
Pisane od ręki więc mogą być literówki, chodzi tu tylko o koncepcję.
UDAT
10.07.2007, 14:41:40
W linii 17. powinno być $r1 zamiast $row, poza tym złe ciapki (ale pewnie to wina forum )
Riggs
10.07.2007, 14:56:10
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.