Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> wyswzukiwanie po 5 tabelach
voytass
post
Post #1





Grupa: Zarejestrowani
Postów: 113
Pomógł: 0
Dołączył: 15.04.2002
Skąd: Warszawa

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


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.


--------------------
Wojtek@7; Wojtek@ogniwo.net; [Simple Forum - 100% - phpclasses.org]; MCP
Go to the top of the page
+Quote Post
SongoQ
post
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%)
-----


  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.


--------------------
Go to the top of the page
+Quote Post
popo
post
Post #3





Grupa: Zarejestrowani
Postów: 85
Pomógł: 0
Dołączył: 15.07.2005

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


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

Ten post edytował popo 26.07.2005, 18:23:22
Go to the top of the page
+Quote Post
SongoQ
post
Post #4





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


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.


--------------------
Go to the top of the page
+Quote Post
voytass
post
Post #5





Grupa: Zarejestrowani
Postów: 113
Pomógł: 0
Dołączył: 15.04.2002
Skąd: Warszawa

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


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.

Ten post edytował voytass 26.07.2005, 08:45:28


--------------------
Wojtek@7; Wojtek@ogniwo.net; [Simple Forum - 100% - phpclasses.org]; MCP
Go to the top of the page
+Quote Post
SongoQ
post
Post #6





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


Mysle ze wystarczy LEFT JOIN.


--------------------
Go to the top of the page
+Quote Post
Jabol
post
Post #7





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

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


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


Ten post edytował Jabol 26.07.2005, 10:22:19
Go to the top of the page
+Quote Post
SongoQ
post
Post #8





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


--------------------
Go to the top of the page
+Quote Post
voytass
post
Post #9





Grupa: Zarejestrowani
Postów: 113
Pomógł: 0
Dołączył: 15.04.2002
Skąd: Warszawa

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


union jest dostepne od mysql 4.0 a ja dysponuje 3.23 wiec zostane przy left join ale dzieki za info.


--------------------
Wojtek@7; Wojtek@ogniwo.net; [Simple Forum - 100% - phpclasses.org]; MCP
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 Aktualny czas: 19.08.2025 - 13:44