Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MYSQL][PHP] Wyszukiwanie z sortowaniem 2 warunkowym?
Forum PHP.pl > Forum > Przedszkole
Coolbob
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
Sephirus
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 wink.gif

EDIT: poprawiłem pomyłke w SQL
kyku
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
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-2025 Invision Power Services, Inc.