Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> zlaczenie 3 tabel
a79rtur
post 23.09.2005, 09:30:17
Post #1





Grupa: Zarejestrowani
Postów: 331
Pomógł: 1
Dołączył: 23.05.2004
Skąd: Tarnów/Londyn

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


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


--------------------
php 5.1.2 & Apache 2.0.50 & MySQL 4.1.7 @ WinXP Pro
..:: GG 6449856 ::..
www.londyn.me.uk - ogłoszenia mieszkaniowe dla Londynu
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
SongoQ
post 23.09.2005, 10:33:20
Post #2





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


chyba IS NULL a nie = NULL


--------------------
Go to the top of the page
+Quote Post
a79rtur
post 23.09.2005, 11:32:04
Post #3





Grupa: Zarejestrowani
Postów: 331
Pomógł: 1
Dołączył: 23.05.2004
Skąd: Tarnów/Londyn

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


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


--------------------
php 5.1.2 & Apache 2.0.50 & MySQL 4.1.7 @ WinXP Pro
..:: GG 6449856 ::..
www.londyn.me.uk - ogłoszenia mieszkaniowe dla Londynu
Go to the top of the page
+Quote Post
Synaps
post 23.09.2005, 12:00:25
Post #4





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

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


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.


--------------------
MySQL said:

You have an error in your SQL syntax near ' `sygnatura` VARCHAR, NOT NULL
Go to the top of the page
+Quote Post
SongoQ
post 23.09.2005, 14:04:27
Post #5





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


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).


--------------------
Go to the top of the page
+Quote Post
a79rtur
post 23.09.2005, 22:28:34
Post #6





Grupa: Zarejestrowani
Postów: 331
Pomógł: 1
Dołączył: 23.05.2004
Skąd: Tarnów/Londyn

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


podselekta tzn? mozna jakis przykład prosić ?


--------------------
php 5.1.2 & Apache 2.0.50 & MySQL 4.1.7 @ WinXP Pro
..:: GG 6449856 ::..
www.londyn.me.uk - ogłoszenia mieszkaniowe dla Londynu
Go to the top of the page
+Quote Post
FanFataL
post 24.09.2005, 09:05:27
Post #7





Grupa: Przyjaciele php.pl
Postów: 13
Pomógł: 0
Dołączył: 6.09.2005
Skąd: Kraków / Katowice / Bydgoszcz

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


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
...


--------------------
The people who are trying to make this world worse are not taking a day off. How can I? - Light up the darkness
Go to the top of the page
+Quote Post
a79rtur
post 24.09.2005, 17:25:00
Post #8





Grupa: Zarejestrowani
Postów: 331
Pomógł: 1
Dołączył: 23.05.2004
Skąd: Tarnów/Londyn

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


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 ?

Ten post edytował a79rtur 24.09.2005, 19:01:26


--------------------
php 5.1.2 & Apache 2.0.50 & MySQL 4.1.7 @ WinXP Pro
..:: GG 6449856 ::..
www.londyn.me.uk - ogłoszenia mieszkaniowe dla Londynu
Go to the top of the page
+Quote Post
FanFataL
post 24.09.2005, 21:13:52
Post #9





Grupa: Przyjaciele php.pl
Postów: 13
Pomógł: 0
Dołączył: 6.09.2005
Skąd: Kraków / Katowice / Bydgoszcz

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


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
...


--------------------
The people who are trying to make this world worse are not taking a day off. How can I? - Light up the darkness
Go to the top of the page
+Quote Post
markac
post 26.09.2005, 11:36:19
Post #10





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 23.02.2005

Ostrzeżenie: (10%)
X----


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