Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Zapytanie sql zwraca błędne wyniki
Forum PHP.pl > Forum > Przedszkole
-Piotrek-
Witam,
Moje zapytanie wygląda tak:

  1. SELECT id,tytul,link FROM `tabela` WHERE match(tytul) against ("+'.$szukane.'*" IN BOOLEAN MODE) GROUP BY link order by match(tytul) against("+'.$szukane.'*") desc


Przy wyszukiwaniu załóżmy: 'andrzej nowakowski kiedy nadejdzie jutro', wyniki wyglądają mniej więcej tak:

1. andrzej nowakowski - andrzej nowakowski - nadzieja
2. andrzej nowakowski - zmierch
3. andrzej nowakowski
4. andrzej nowakowski - kiedy
5. andrzej nowakowski - kiedy nadejdzie jutro
6. andrzej nowakowski - zima

Pomijając fakt, że niektóre rekordy, jak widać mają błędne tytuły to jednak dlaczego to co jest idealnym dopasowaniem dla szukanej frazy, zamiast
na początku jest dopiero na 5 miejscu ?

Problem ten występuje tylko dla pewnych zapytań, ale jednak coś jest nie tak.
Jak to naprawić ?
Z góry dzięki za pomoc!
pmir13
W order by wykorzystujesz match, który nie jest w boolean mode, jak najbardziej słusznie, ale ze składnią skopiowaną z boolean mode, co powoduje traktowanie dodatkowych znaków jako zawartości do wyszukania, dzięki temu nie jest to już idealne dopasowanie. Usunięcie ich rozwiąże problem kolejności. Natomiast dodatkowe błędne wyniki spowodowane są tym, że "+'.$szukane.'*" oznacza w tym przypadku "+'.andrzej nowakowski kiedy nadejdzie jutro.'*". Powinno być "+".$szukane."*".
-Piotrek-
W takim razie jak zmodyfikować order by, żeby działało tak jak trzeba, bo szczerze mówiąc próbowałem już wielu kombinacji, ale ciągle
nie mogę uzyskać zadowalającego efektu ?
pmir13
  1. $query = "SELECT id,tytul,link FROM tabela WHERE match(tytul) against ('+$szukane*' IN BOOLEAN MODE) GROUP BY link order by match(tytul) against ('$szukane') desc";

W ten sposób masz poprawną kolejność, przy założeniu dokładnego przypasowania pierwszego słowa z frazy.
Jeśli jednak chcesz wyłącznie idealną zgodność
  1. $query = "SELECT id,tytul,link FROM tabela WHERE match(tytul) against ('\"$szukane\"' IN BOOLEAN MODE) GROUP BY link order by match(tytul) against ('$szukane') desc";

-Piotrek-
Nie za bardzo mi to działa.
Pierwszy sposób czyli:
  1. $sql = 'SELECT id,tytul,link FROM `tabela` WHERE match(tytul) against ("+'.$szukane.'*" IN BOOLEAN MODE) GROUP BY link order by match(tytul) against("'.$szukane.'") desc';

Działa identycznie z tym co podałem na początku.

Natomiast drugi sposób:
  1. $sql = 'SELECT id,tytul,link FROM `tabela` WHERE match(tytul) against ('\"$szukane\"' IN BOOLEAN MODE) GROUP BY link order by match(tytul) against("'.$szukane.'") desc';

wywala mi błędy:
  1. Warning: Unexpected character in input: '\' (ASCII=92) state=1 on line 128
  2. Parse error: syntax error, unexpected '"' on line 128
pmir13
Nie dziwne, że nie działa lub wywala błędy skoro źle przepisujesz. Proponuję kopiuj/wklej.
Oczywiście $query na $sql możesz zamienić, ale resztę zostaw dokładnie.

Pierwsze zapytanie dla zestawu:

andrzej nowakowski - andrzej nowakowski - nadzieja
andrzej nowakowski - zmierch
andrzej nowakowski
andrzej nowakowski - kiedy
andrzej nowakowski - kiedy nadejdzie jutro
andrzej nowakowski - zima

i szukanej frazy "andrzej nowakowski - kiedy nadejdzie jutro" zwraca:

andrzej nowakowski - kiedy nadejdzie jutro
andrzej nowakowski - kiedy
andrzej nowakowski - andrzej nowakowski - nadzieja
andrzej nowakowski - zmierch
andrzej nowakowski
andrzej nowakowski - zima

natomiast drugie zapytanie dla tej samej frazy zwraca

andrzej nowakowski - kiedy nadejdzie jutro
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.