Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Przebudowanie zapytania z LIKE na rzecz funkcji MATCH oraz AGAINST
majestiq
post
Post #1





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 26.10.2006

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


Dostalem z home.pl info o tym, że używam nieefektywnego zapytania z LIKE i info o konieczności zamiany jak w temacie.
Coś mi nie idzie jednak ta zamiana,

Pierwotny kod wygląda w ten sposób:

  1. $sql = 'SELECT id,tytul,rozmiar,licznik,dlugosc FROM `'.$tabelka.'` WHERE `tytul` LIKE \'%'.$nazwa'%\' ORDER by tytul LIMIT 1000 ';
  2. $result = mysql_query($sql);


Da się to w ogóle tak zamienić, żęby nie używać LIKE jednak wyszukiwanie działało identycznie, tzn bez względu,
którą część frazy się w pisze i czy ma ona tylko 2znaki czy więcej ?

// Sami założyli mi indexy na bazie, któe podobno są konieczne w tym wypadku:

mysql> create fulltext index idx_tytul on artykuly(tytul);

Ten post edytował majestiq 17.08.2009, 07:43:48
Go to the top of the page
+Quote Post
kfc4
post
Post #2





Grupa: Zarejestrowani
Postów: 195
Pomógł: 18
Dołączył: 7.10.2007

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


To jest wyszukiwanie pełnotekstowe. http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html . Najpierw musisz na `tytul` założyć index FULL TEXT.
A później:
  1. SELECT * FROM tabelka WHERE match(tytul,tresc) against ('szukany tekst' IN NATURAL LANGUAGE MODE);


Ten post edytował kfc4 17.08.2009, 07:50:30
Go to the top of the page
+Quote Post
majestiq
post
Post #3





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 26.10.2006

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


A czym jest 'tresc' ?
$sql = 'SELECT id,tytul,rozmiar,licznik,dlugosc FROM `'.$tabelka.'` - to jest treść ?

Rozumiem, że zamiast 'szukany tekst' mam dać $nazwa ?
Go to the top of the page
+Quote Post
kfc4
post
Post #4





Grupa: Zarejestrowani
Postów: 195
Pomógł: 18
Dołączył: 7.10.2007

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


Nie, treść jest treścią, możesz to wywalić, dałem tam to z przyzwyczajenia, bo artykułów szuka się też po treści. A szukany tekst to tak - $nazwa. Masz opisane wszystko w dokumentacji (link wyżej).
Go to the top of the page
+Quote Post
majestiq
post
Post #5





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 26.10.2006

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


Wygląda, że jest już blisko - nie sypie błędami ale jako wynik wyświetla mi dalszą część skryptu,
która pojawia się w wypadku braku conajmniej jednego wyniku.

Może coś zjadłem ?

Podam jeszcze raz starą (poprawną wersję) z LIKE i nową nie do końca działającą:

  1.  
  2. //$sql = 'SELECT id,tytul,rozmiar,licznik,dlugosc FROM `'.$tabelka.'` WHERE `tytul` LIKE \'%'.$nazwa.'%\' ORDER by tytul LIMIT 1000 ';
  3.  
  4. $sql ='SELECT * FROM `'.$tabelka.'` WHERE match(tytul) against ($nazwa IN NATURAL LANGUAGE MODE)';
  5.  



O czym zapomniałem ?
Go to the top of the page
+Quote Post
kfc4
post
Post #6





Grupa: Zarejestrowani
Postów: 195
Pomógł: 18
Dołączył: 7.10.2007

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


Hmm, zapytanie po lekkich modyfikacjach się wykonuje (po wywaleniu zmiennych) - więc powinno być OK. Zamiast $nazwa daj "'.$nazwa.'"
Go to the top of the page
+Quote Post
majestiq
post
Post #7





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 26.10.2006

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


Zrobiłem tak jak napisałeś i dalej to samo.
Może chodzi o to, że to nie jest powiązane z tym indexem:
mysql> create fulltext index idx_tytul on artykuly(tytul);
Go to the top of the page
+Quote Post
kfc4
post
Post #8





Grupa: Zarejestrowani
Postów: 195
Pomógł: 18
Dołączył: 7.10.2007

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


Nie wiem o co chodzi. Trzeba kogoś mądrzejszego pytać. Odpaliłem painta żeby Ci pokazać, że jednak to działa.
[img=http://img36.imageshack.us/img36/5471/forumphppl.th.jpg]
Go to the top of the page
+Quote Post
majestiq
post
Post #9





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 26.10.2006

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


Hmm, dziwna sprawa.
Będę próbował dalej.

W każdym razie wielkie dzięki za zaangażowanie !


Jeszcze jedno, niby banał, ale nie mogę za pomocą print_r ani var_dump
podgladnac co jest w zmiennej:

  1.  
  2. $sql = 'SELECT id,tytul,rozmiar,licznik,dlugosc FROM `'.$tabelka.'` WHERE `tytul` LIKE \'%'.$nazwa.'%\' ORDER by tytul LIMIT 1000 ';
  3.  
  4. var_dump($sql);
  5. print_r($sql);
  6.  
  7. $result = mysql_query($sql);
  8. var_dump($result);
  9. print_r($result);
  10.  


W wyniku tych zapytań dostaje albo kopię zayptania sql-owego albo resource ale nie moge wyswietlic tego co zostalo pobrane z bazy:

string(105) "SELECT id,tytul,rozmiar,licznik,dlugosc FROM `tabela` WHERE `tytul` LIKE '%ddd%' ORDER by tytul LIMIT 1000 " SELECT id,tytul,rozmiar,licznik,dlugosc FROM `tabela` WHERE `tytul` LIKE '%ddd%' ORDER by tytul LIMIT 1000 resource(10) of type (mysql result) Resource id #10
Szukana fraza: ddd / znaleziono 129 rekordów

?
Go to the top of the page
+Quote Post
kfc4
post
Post #10





Grupa: Zarejestrowani
Postów: 195
Pomógł: 18
Dołączył: 7.10.2007

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


var_dump jest do wyświetlenia rodzaju informacji, a print_r jest do wyświetlania tablic. Musisz dać $tablica = mysql_fetch_array($result), a później print_r($tablica). Tylko nie jestem pewien czy dobrze zapisałem nazwę tej funkcji - musisz sprawdzić w manualu.
PS. Czemu nie używasz MySQLi albo PDO? Są wygodniejsze w użyciu.

Ten post edytował kfc4 18.08.2009, 10:29:40
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 - 06:43