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 (1 - 7)
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
patigo
post
Post #3





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

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


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 .
Go to the top of the page
+Quote Post
FiDO
post
Post #4





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


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.
Go to the top of the page
+Quote Post
patigo
post
Post #5





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

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


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ć??
Go to the top of the page
+Quote Post
FiDO
post
Post #6





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


Nie majac tych danych i dokladniejszej struktury tabel (niz pole1, pole2 ...) ciezko wiecej pomoc.
Go to the top of the page
+Quote Post
patigo
post
Post #7





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

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


Wieczorkiem postaram się stworzyć uproszczony obraz tej bazy z podstawowymi tabelami i powiązaniami.
Go to the top of the page
+Quote Post
FiDO
post
Post #8





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


Ok.. to znacznie ulatwi sprawe.
Go to the top of the page
+Quote Post

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: 23.08.2025 - 02:10