Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: wyswzukiwanie po 5 tabelach
Forum PHP.pl > Forum > Bazy danych > MySQL
voytass
czesc


wyszukiwanie m aodbywac sie po 5 tabelach poniewaz sa relacje miedzy pierwsza a 4 pozostalymi

tab 1 'uzytkownicy'
id | imie | nazwisko | miasto

tab 2 'praca'
id | uzkid(klucz 'id' z tab 1) | stanowisko | firma

tab 3 'szkola'
id | uzkid(klucz 'id' z tab 1) | nazwa | uwagi

tab 4 'kursy'
id | uzkid(klucz 'id' z tab 1) | nazwa | uwagi

tab 5 'dodatkowe'
id | uzkid(klucz 'id' z tab 1) | podsumowanie | uwagi


chce otrzymac wynik w postaci uzytkownika ktory w tabeli praca, szkola, kursy, dodatkowe posiada okreslony ciag znakow. jeden uzytkownik moze miec kilka prac, szkol, kursow ale tylko jeden wpis w tabeli dodatkowe.
SongoQ
  1. SELECT *
  2. FROM uzytkownicy, praca, szkola, kursy, dodatkowe WHERE uzytkownicy.id = praca.uzkid AND uzytkownicy.id = szkola.uzkid AND uzytkownicy.id = kursy.uzkid AND uzytkownicy.id = dodatkowe.uzkid AND ..... dodatkowe warunki


Mozesz rowniez wykorzystac LEFT JOIN.

Temat przewija sie przez forum co 2 dzien, radze szukac na forum.
popo
nie bardzo wiem po co wbijac wszystko w 1 zapytanie sqla? Nie lepiej polaczyc tylko te tabele, co do ktorych jestesmy pewni, ze beda mialy po jednym wpisie a reszte wyciagnac osobnymi zapytaniami z odpowiednimi warunkami ?
Np pobrac d z tabeli uzytkownicy i potem pobierac dane z pozostalych podajac w klauzuli where uzkid=uzytkownicy.id takie zapytania powinny wykonywac sie szybciej zwlaszcza jesli nie wyciagamy wszystkich pol z tabel a tylko te niezbedne.
Jedynym warunkiem zastosowania kilku kwerend do osobnych tabel jest wykonanie najpierw kwerendy na tabeli uzytkownikow i pobranie z niej ida ktory potem wstawiamy do reszty zapytan (takie rozwiazanie daje o ile sie nie myle mniejsze obciazenie pamieci serwera, bo tabela powstala z jointa to bedzie suma wszystkich zwroconych wierszy wszystkich tabel, np wpis z tabeli uzytkownicy zostanie powielony tyle razy ile jest rekordow w tabeli ktora zwroci ich najwiecej)

Sorka chyba jeszcze sie do konca nie obudzilem jak pisalem ta odpowiedz (blednie zrozumialem pytanko) sleepysmiley03.gif
SongoQ
Jedno zapytanie jest wydajniejsze niz n odwolan do bazy + do tego przesylanie danych. Po co do tego wykorzystywac php, jak mozna gotowy wynik zwrocic z bazy. Wlasnie do tego sluza byzy danych, nie tylko do skladowania danych ale rowniez do obliczen, relacji.
voytass
zreszta te zapytanie ma spelniac funkcje szukajaca, nie widze sensu rozbijania tego na kilka zapytan. wynik musimy miec w postaci danych uzytkownika, dla ktorefo spelnione sa warunki szukania. np. (szukanie zaawansowane)znajdz uzytkownika, ktory pracuje w firmie xxxx, skonczyl szkole YYY ma skonczone kursy AAA itd. albo szukanie proste gdzie wpisuje sie w formularzu szukana fraze i dopasowywana jest ona w rozne pola w tych wszystkich tabelach.

wczoraj wieczorkiem napisalem tak:
  1. SELECT *
  2. FROM uzytkownicy u LEFT OUTER JOIN doswiadczenie d ON (d.uzkid=u.id) LEFT OUTER JOIN edukacja e ON (e.iduzk=u.id) LEFT OUTER JOIN infodod i ON (i.iduzk=u.id) WHERE (u.imie LIKE '%cos%' OR d.stanowisko LIKE '%cos%' OR e.szkola LIKE '%cos%') AND i.zaint = '%cosinnego%'' group by u.id

co prawda inne sa nazwy tabel i nie jest ich 5 ale nawiazuje do tego samego


i analizuje jakie mi zwraca wyniki, gdy nie bylo czesci AND i.zaint ocenilem , ze dziala OK ale gdy to dodalem to juz nie rozumialem, gdyz nie zwrocilo mi rekorku o ktorym wiedzialem, ze zwrocilem (moze przegapilem bo pozno bylo). Czy w ogole dobra jest koncepcja takiego zapytania (kilka left outer join)? wczesnie zrobilem takie samo zapytanie tylko bez OUTER.
ide dalej zaglebiac sie w SQl.
SongoQ
Mysle ze wystarczy LEFT JOIN.
Jabol
left join to to samo, co left outer join. słówko outer jest tylko po to, żeby było logicznie odwrotenie niż w inner joinach, które jedna nie rozróżniają left i right, bo każdy stronniczy join jest outer joinem.

A tak swoją drogą możesz sobie pokombinować w prostszy sposób poprzez UNION:
  1. SELECT 'szkoła.nazwa' AS section, id, nazwa AS search
  2. FROM szkola WHERE nazwa LIKE '....' UNION SELECT 'szkoła.uwagi' AS section, id, uwagi AS search
  3. FROM szkola WHERE uwagi LIKE '....' UNION SELECT
  4. 'praca.firma' AS section, id, firma AS search
  5. FROM praca WHERE firma LIKE '....' UNION ... (i tak po jednym selekcie dla każdego pola wg wymienionego schematu).
Jeżeli potrzebujesz dla określonego USERA możesz zrobić tak:
  1. SELECT *
  2. FROM (SELECT 'szkoła.nazwa' AS section, id, uzkid, nazwa AS search
  3. FROM szkola WHERE nazwa LIKE '....' UNION SELECT 'szkoła.uwagi' AS section, id, uzkid, uwagi AS search
  4. FROM szkola WHERE uwagi LIKE '....' UNION SELECT
  5. 'praca.firma' AS section, id, uzkid, firma AS search
  6. FROM praca WHERE firma LIKE '....' UNION ... (i tak po jednym selekcie dla każdego pola wg wymienionego schematu).) AS sub WHERE uzkid = user;
albo
  1. SELECT 'szkoła.nazwa' AS section, id, nazwa AS search
  2. FROM szkola WHERE nazwa LIKE '....' AND uzkid = user UNION SELECT 'szkoła.uwagi' AS section, id, uwagi AS search
  3. FROM szkola WHERE uwagi LIKE '....' AND uzkid = user UNION SELECT
  4. 'praca.firma' AS section, id, firma AS search
  5. FROM praca WHERE firma LIKE '....' AND uzkid = user UNION ... (i tak po jednym selekcie dla każdego pola wg wymienionego schematu).
SongoQ
Cytat
left join to to samo, co left outer join. słówko outer jest tylko po to, żeby było logicznie odwrotenie niż w inner joinach, które jedna nie rozróżniają left i right, bo każdy stronniczy join jest outer joinem.

Dlatego napisalem samo LEFT JOIN smile.gif

Wydaje mi sie ze po przez UNION zapytanie troszeczke straci na wydajnosci.
voytass
union jest dostepne od mysql 4.0 a ja dysponuje 3.23 wiec zostane przy left join ale dzieki za info.
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.