Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wydajność zapytań i nie tylko...
Forum PHP.pl > Forum > Bazy danych > MySQL
patigo
Witam

mam taki mały problemik.
mam bazę danych ( dość sporą ) , w której znajduje się kilka tabel.
Stworzyłem zapytanie odwołujące się do trzech tabel i wszystko działa pięknie ale chciałbym zmodyfikować troche zapytanie i nie tworzyć dwóch odrębnych zapytań tylko jedno. Mianowicie wygląda to mniej więcej tak:
  1. Pierwsze zapytanie
  2. SELECT tabela1.pole1, tabela1.pole3
  3. FROM tabela1, tabela2, tabela3 WHERE tabela1.pole2 LIKE '%jakaśfraza%' AND tabela2.pole2=tabela1.pole3 AND tabela2.pole4=tabela3.pole5
  4.  
  5. Drugie zapytanie
  6. SELECT tabela1.pole1, tabela1.pole3
  7. FROM tabela1, tabela2, tabela3 WHERE tabela1.pole4 LIKE '%jakaśfraza%' AND tabela2.pole2=tabela1.pole3 AND tabela2.pole4=tabela3.pole5


a wyniki obu zapytań wyświetlam razem. chciałbym zastosować uproszczenie i zapytać tak:

  1. SELECT tabela1.pole1, tabela1.pole3
  2. FROM tabela1, tabela2, tabela3 WHERE tabela1.pole2 LIKE '%jakaśfraza%' OR tabela1.pole4 LIKE '%jakaśfraza%'AND tabela2.pole2=tabela1.pole3 AND tabela2.pole4=tabela3.pole5


I w tym momęcie mogę jechać po zakupy na miasto:) tak długo mieli to zapytanie i nie daje wyników. Może ktoś wie dlaczego??

Chciałbym aby zapytanie działało tak że wybiera mi z bazy np rekordy w których znajdyję się szukana fraza w polu2 i polu4 (pola tekstowe) ale nie dublowało wyników Tzn. stosując pierwszą wersję podwójnych zapytań otrzymuje podwójne wyniki - wyświetla mi te rekordy gdzie fraza znajduje się zarówno w polu2 jaki i w polu4, często wyświetlając dwa takie same rekordy gdyż pierwsze zapytanie pokazuje rekord dla którego fraza jest w polu2 a nstępnie pokazuje rekord gdzie fraza jest w polu4, a ponieważ często jest tak że taka sama fraza może znaleźć się w polu 2 oraz polu4 zatem wyświetla 2 takie same rekordy. Jak temu zaradzić?? Może ma ktoś ciekawy pomysłquestionmark.gif
FiDO
Po pierwsze to tak:
  1. SELECT tabela1.pole1, tabela1.pole3
  2. FROM tabela1, tabela2, tabela3 WHERE (INSTR(tabela1.pole2, 'jakaśfraza') > 0 OR INSTR(tabela1.pole4, 'jakaśfraza') > 0) AND tabela2.pole2=tabela1.pole3 AND tabela2.pole4=tabela3.pole5
  3.  
  4. # lub
  5.  
  6. SELECT tabela1.pole1, tabela1.pole3
  7. FROM tabela1, tabela2, tabela3 WHERE INSTR(CONCAT(tabela1.pole2, tabela1.pole4), 'jakaśfraza') > 0 AND tabela2.pole2=tabela1.pole3 AND tabela2.pole4=tabela3.pole5


INSTR bedzie szybsze niz LIKE jesli chcesz tylko wyszukac dany ciag. Pomiedzy tymi dwoma wersjami nie wiem czy bedzie roznica, ale jak juz sprawdzisz to sie pochwal, ktore rozwiazanie wygralo, chetnie sie dowiem (po cichu obstawiam nr 1).

Poza tym koniecznie dodaj indexy na nastepujace pola:
tabela1.pole3
tabela2.pole2
tabela2.pole4
tabela3.pole5
patigo
Skrypt zarówno 1 jaki i 2 działają poprawnie tzn, nie wywala żadnych błędów wykonuje się zapytanie ale zwraca 0 czyli że nie odnaleziono żadnego rekordu dla podanych kryteriów:( może przy takim zapytaniu innaczej się pobiera dane??
Ja kożystam z pętli While .
FiDO
Sposob pobierania danych nie zmienia sie. Dla pewnosci mozesz sprawdzic zapytanie np. w phpMyAdmin. Pozatym upewnij sie, ze masz dane, ktore spelniaja wszystkie 3 warunki na raz.
patigo
Hmm.... Już chciałem pisać że nic nie działa ale....
okzało się że w zapytaniu do phpmyadmina
  1. SELECT tabela1.pole1, tabela1.pole3
  2. FROM tabela1, tabela2, tabela3 WHERE INSTR(CONCAT(tabela1.pole2, tabela1.pole4), 'jakaśfraza') > 0 AND tabela2.pole2=tabela1.pole3 AND tabela2.pole4=tabela3.pole5

w miejscu jakaśfraza miałem coś takiego '%$zmienna%' dlatego też zwracał pusty wynik pytanie było pomyślne ale bez wyniku natomiast gdy zrobiłem '$zminna' zaczeło działać ale przyniosło odmienny skutek:(mam pewne dane zliczone w bazie i wiem że przy takim kryterium powinno mi zwrucić 44 rekordy a zwraca 2, )
nie wiem co tu jeszcze zrobić??
FiDO
Nie majac tych danych i dokladniejszej struktury tabel (niz pole1, pole2 ...) ciezko wiecej pomoc.
patigo
Wieczorkiem postaram się stworzyć uproszczony obraz tej bazy z podstawowymi tabelami i powiązaniami.
FiDO
Ok.. to znacznie ulatwi sprawe.
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-2024 Invision Power Services, Inc.