Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MYSQL][PHP] Wyszukiwanie z sortowaniem 2 warunkowym?
Coolbob
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 10.10.2006

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


Witam!

Mam tabelę w MySQL-u z artykułami (id, tytuł, treść itd.). Zrobiłem wyszukiwarkę artykułów przeszukującą ich treść. Chciałbym teraz zmodyfikować sposób wyszukiwania aby uporządkować wyniki w ten sposób, że w pierwszej kolejności wyświetlają się artykuły, w tytule których znajduje się wyszukiwane słowo, a następnie pozostałe z sortowaniem wg trafności.
Mógłbym zrobić dwa SELECT-y tylko nie wiem jak zrobić by w drugim zapytaniu nie dublowały się wyniki z pierwszego zapytania... a może jakieś złożone pojedyńcze zapytanie...
Proszę o pomoc.

pozdrawiam
coolbob
Go to the top of the page
+Quote Post
Sephirus
post
Post #2





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

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


Jeśli nie masz indeksów fulltekstowych musisz skorzystać z LIKE jeśli masz to MATCH AGAINST w MySQL wystarczy by wybrać wszystkie rekordy i posortować je wg trafności.

Przy braku indeksów można użyć następującej składni:


  1. SELECT *, (title LIKE "%szukane%") + (tresc LIKE "%szukane%") AS trafnosc FROM artykuly ORDER BY (title LIKE "%szukane%" + tresc LIKE "%szukane%") DESC


W przypadku MATCH AGAINST odsyłam po prostu do manuala (IMG:style_emoticons/default/wink.gif)

EDIT: poprawiłem pomyłke w SQL

Ten post edytował Sephirus 26.09.2012, 07:39:33
Go to the top of the page
+Quote Post
kyku
post
Post #3





Grupa: Zarejestrowani
Postów: 116
Pomógł: 8
Dołączył: 21.11.2008

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


Przy większej bazie powyższe zapytanie zajedzie serwer.
Zainteresuj się wyszukiwaniem pełnotekstowym (full-text search)
mozna np. joinem
  1. SELECT pd.products_id, pd.products_name, p.products_price, MATCH (p.products_model) AGAINST ('LAA 0209' IN BOOLEAN MODE)
  2. OR MATCH (pd.products_name,pd.products_description) AGAINST ('LAA 0209' IN BOOLEAN MODE) AS score
  3. FROM products_description pd
  4. LEFT JOIN products p
  5. ON pd.products_id = p.products_id
  6. WHERE MATCH (p.products_model) AGAINST ('LAA 0209' IN BOOLEAN MODE)
  7. OR MATCH (pd.products_name,pd.products_description) AGAINST ('LAA 0209' IN BOOLEAN MODE)
  8. AND p.products_status = 1
  9. ORDER BY score DESC

albo unionem
  1. SELECT * FROM
  2. (SELECT title,message, MATCH(title, message) AGAINST('$keywords') AS score FROM news WHERE MATCH(title, message) AGAINST('$keywords')
  3. UNION
  4. SELECT title,message, MATCH(title, message) AGAINST('$keywords') AS score FROM downloads WHERE MATCH(title, message) AGAINST('$keywords')
  5. ...) a ORDER BY SCORE DESC


Ten post edytował kyku 26.09.2012, 07:56:10
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 - 12:15