Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zlaczenie 3 tabel
Forum PHP.pl > Forum > Bazy danych > MySQL
a79rtur
witam
mam nastepujacy proble
sa 3 tabele tab1, tab2 i tab3 potrzebuje dostac rekordy ktore występują w tab1 ale nie mają odpowiednika w tab2 lub tab3, lub tez w zadnej z nich. probowalem cos w stylu
  1. SELECT *
  2. FROM tab1 LEFT JOIN tab2 ON tab1.pole1=tab2.pole2 LEFT JOIN tab3 ON tab1.pole1=tab3.pole3 WHERE tab2.id=NULL OR tab3.id=NULL

ale nie dalo to dobrych rezultatów
SongoQ
chyba IS NULL a nie = NULL
a79rtur
rzeczywiscie pomoglo smile.gif, chociaz nie rozumiem jaka jest roznica
teraz mam takie pytanie, w tej pierwszej tabeli jest kilka tysiecy rekordow w drugiej kilkaset a w trzeciej niewiele, jak to zoptymalizowac, bo teraz sie wykonuje pare minut
Synaps
Możesz spróbować zapisać swoje zapytanie za pomocą NOT EXISTS lub NOT IN. Przy takim rozłożeniu danych może być taka opcja wydajniejszcza. Dodatkowo możesz założyć indeksy (w zależności od selektywności kolumny ) na pole wykorzystywane do złączenia.
SongoQ
Cytat
chociaz nie rozumiem jaka jest roznica

W bazach danych nie ma czegos takiego ze jest rowne null. Zawsze sie stosuje IS NUL, lub IS NOT NULL. A co sie bede tlumaczyl, dokumentacja SQLa i juz. Tam wszystko pisze.

Odnosnie optymalizacji.
Mozesz podeslekta i mieszac ulozeniem warunkow. Na poczatku warunki do najmniejszej liczby a potem laczysz z wiekszymi tabelami (wiecej rekordow).
a79rtur
podselekta tzn? mozna jakis przykład prosić ?
FanFataL
Cytat(a79rtur @ 2005-09-23 08:30:17)
witam
mam nastepujacy proble
sa 3 tabele tab1, tab2 i tab3 potrzebuje dostac rekordy ktore występują w tab1 ale nie mają odpowiednika w tab2 lub tab3, lub tez w zadnej z nich. probowalem cos w stylu
  1. SELECT *
  2.  
  3. FROM tab1 LEFT JOIN tab2 ON tab1.pole1=tab2.pole2 LEFT JOIN tab3 ON tab1.pole1=tab3.pole3 WHERE tab2.id=NULL OR tab3.id=NULL

ale nie dalo to dobrych rezultatów

Z doświadczenia wiem że najdłużej trwają w MySQLu zapytania z OR ;/
Ja bym proponował zrobic w ten spoób:
  1. (SELECT tab1.*
  2.  
  3. FROM tab1 LEFT JOIN tab2 ON tab1.pole1=tab2.pole2
  4. WHERE tab2.id IS NULL)
  5. UNION
  6. (SELECT tab1.*
  7.  
  8. FROM tab1 LEFT JOIN tab3 ON tab1.pole1=tab3.pole3
  9. WHERE tab3.id IS NULL)

Mam nadzieje że pomoże winksmiley.jpg

Cytat("SongoQ")
Mozesz podeslekta i mieszac ulozeniem warunkow
Podselekty w mysqlu są bardzo mało wydajne i dodatkowo dostępne dopiero od wersji 5 w SELECT ;/

Pozdrawiam winksmiley.jpg
...
a79rtur
mozliwe ze to jest ok, tyle ze to mi zwraca sume tych wyników z selektów. mi potrzeba czesc wspolną, czyli te co spelniają oba te warunki a nie przynajmniej jeden z nich. probowalem INTERSECT albo blad jest, moze przez te LEFT JOIN'y ?
FanFataL
Cytat(a79rtur @ 2005-09-24 16:25:00)
mozliwe ze to jest ok, tyle ze to mi zwraca sume tych wyników z selektów. mi potrzeba czesc wspolną, czyli te co spelniają oba te warunki a nie przynajmniej jeden z nich. probowalem INTERSECT albo blad jest, moze przez te LEFT JOIN'y ?

Hmm - to ja ma spełniać oba te rarunki to dlaczego dajesz OR w zapytaniu questionmark.gif

  1. SELECT tab1.*
  2. FROM tab1 LEFT JOIN tab2 ON tab1.pole1=tab2.pole2 LEFT JOIN tab3 ON tab1.pole1=tab3.pole3 WHERE tab2.id IS NULL AND tab3.id IS NULL


Dodatkowym czynnikiem zwiększającym szybkośc może być nałożenie indexów na pola na których robisz złączenia ;]

Pozdrawiam winksmiley.jpg
...
markac
a79rtur. Jeśli chodzi Ci o selekcję, to czemu używasz operatorów projekcji?
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.