Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Inteligentne wyszukiwanie z kilku tabel, + stronicowanie
Sztef89
post
Post #1





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 6.12.2010

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


Witam, mam problem z zapytaniem. Chciałbym jednym zapytaniem przeszukać 7 tabel, wyniki posegregować po najbardziej trafnych i ustawić LIMIT x,10. Na razie zrobiłem SELECT'a dla dwóch tabel (bez stronicowania i sortowania wyników):

  1. SELECT uniqid, tytul, tytul_oryg, rok FROM media_filmdata
  2. WHERE MATCH(tytul,tytul_oryg) AGAINST('słowo szukane' IN BOOLEAN MODE)
  3. UNION ALL
  4. SELECT uniqid, tytul, tytul_oryg, rok FROM media_serialdata
  5. WHERE MATCH(tytul,tytul_oryg) AGAINST('słowo szukane' IN BOOLEAN MODE)


Jakbym dodał limit na końcu to wyniki z drugiej tabeli by się wcale nie wyświetliły (nawet jakby słowo szukane było trafione w 100%) dlatego chciałbym posortować wyniki od najlepiej pasujących i wtedy dopiero ograniczyć wyświetlanie.

Przeszukałem już sporo stron, i sporo się dowiedziałem ale nie mogę znaleźć rozwiązania na własnie ten problem.
Z góry dzięki !


-- EDIT --

Trochę pokombinowałem i uzyskałem coś takiego:

  1. SELECT uniqid, tytul, tytul_oryg, rok, MATCH(tytul,tytul_oryg) AGAINST('house') AS score FROM media_filmdata
  2. WHERE MATCH(tytul,tytul_oryg) AGAINST('house')
  3. UNION ALL
  4. SELECT uniqid, tytul, tytul_oryg, rok, MATCH(tytul,tytul_oryg) AGAINST('house') AS score FROM media_serialdata
  5. WHERE MATCH(tytul,tytul_oryg) AGAINST('house')
  6.  
  7. ORDER BY `score` DESC


Ale od razu można zauważyć, że score wyników jest zależny od ilości wyników z danej tabeli. Chciałbym każdą tabelę ograniczyć aby nie "przytłumiła" wyników z drugiej tabeli ("sprawiedliwość"). Już prawie jest to co chce uzyskać ale to tylko prawie... :/

Czyli jak zrobić aby waga nie była uzależniona od ilości wyników TYLKO o samej trafności słowa ?

Ten post edytował Sztef89 7.11.2011, 14:30:48
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Sephirus
post
Post #2





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Wydaje mi się, że dobrze zrozumiałeś (IMG:style_emoticons/default/wink.gif) wariant 3 jest najłatwiejszy i nie wymaga dodatkowych działań (IMG:style_emoticons/default/wink.gif)

Co do pytania to niestety przy paginacji zawsze dwa zapytania ida parami.

Musisz mieć wyniki (stronę wyników) z limitem "pobierz X wyników od rekordu nr Y" oraz "Count(*)" dla wszystkich.

Z tego co mi wiadomo nie da się tego obejść - dopowiem tylko że zapytanie typu "SELECT count(*) AS liczba_filmow FROM filmy" przykładowo działa dość szybko (IMG:style_emoticons/default/wink.gif) nie musisz się tu martwić o wydajność (IMG:style_emoticons/default/wink.gif)

Grunt abyś nie uzywał czegoś w stylu MYSQL_NUM_ROWS() - bo to jest dopiero nie wydajne (IMG:style_emoticons/default/tongue.gif)

Jak zrobisz 2 zapytanka select + limit i select + count to będzie git (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
Sztef89
post
Post #3





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 6.12.2010

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


Cytat(Sephirus @ 8.11.2011, 09:56:13 ) *
Wydaje mi się, że dobrze zrozumiałeś (IMG:style_emoticons/default/wink.gif) wariant 3 jest najłatwiejszy i nie wymaga dodatkowych działań (IMG:style_emoticons/default/wink.gif)

Co do pytania to niestety przy paginacji zawsze dwa zapytania ida parami.

Musisz mieć wyniki (stronę wyników) z limitem "pobierz X wyników od rekordu nr Y" oraz "Count(*)" dla wszystkich.

Z tego co mi wiadomo nie da się tego obejść - dopowiem tylko że zapytanie typu "SELECT count(*) AS liczba_filmow FROM filmy" przykładowo działa dość szybko (IMG:style_emoticons/default/wink.gif) nie musisz się tu martwić o wydajność (IMG:style_emoticons/default/wink.gif)

Grunt abyś nie uzywał czegoś w stylu MYSQL_NUM_ROWS() - bo to jest dopiero nie wydajne (IMG:style_emoticons/default/tongue.gif)

Jak zrobisz 2 zapytanka select + limit i select + count to będzie git (IMG:style_emoticons/default/wink.gif)


Dzięki za odpowiedź.

Nawet nie myślę o używaniu MYSQL_NUM_ROWS() bo to by było przeciwieństwo wydajności hehe (IMG:style_emoticons/default/biggrin.gif)
nie przyglądałem się jeszcze wydajności zapytania count(*) ale skoro mówisz że to ogólnie szybko działa to ok.

Moje problemy zostały rozwiązane. Dzięki za pomoc !
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: 12.10.2025 - 00:12