Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wydajność zapytań i nie tylko...
patigo
post
Post #1





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 4.02.2005

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


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ł(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)

Ten post edytował patigo 17.03.2005, 08:59:49
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
FiDO
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 717
Pomógł: 0
Dołączył: 12.06.2002
Skąd: Wolsztyn..... Studia: Zielona Góra

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


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
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 3.10.2025 - 15:16