Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Funkcja php w zapytaniu SQL
Forum PHP.pl > Forum > Przedszkole
wicy
Mam zapytanie:
  1. $query="SELECT * FROM baza1 p, baza2 c WHERE p.nazwisko LIKE ('".$nazw."%') AND c.id=p.miejsce ORDER BY nazwisko";

Chciałbym do wyszukania nazwisk w bazie użyć funkcji soundex().
Przy dwóch zmiennych $nazw i $nazw_soundex = soundex($nazw) jak użyć zamiast LIKE ('".$nazw."%') czegoś na wzór
  1. $query="SELECT * FROM baza1 p, baza2 c WHERE soundex(p.nazwisko) =".$nazw_soundex." AND c.id=p.miejsce ORDER BY nazwisko";

Można tak zagnieździć php w SQL?
Mustava
Nie, w zapytaniu SQL (składni) nie możesz użyć bezpośrednio funkcji php np
  1. ....WHERE soundex(p.nazwisko) =....

- baza tego nie "skuma".
marian84
Zamiast ładowania funkcji w zapytaniu możesz wywolać zawartość funkcji, a jej wyniki przekazać w zmiennej do zapytania.

  1. $query="SELECT * FROM baza1 p, baza2 c WHERE $WYNIK_Z_FUNKCJI AND c.id=p.miejsce ORDER BY nazwisko";
thek
Ale przecież MySQL posiada funkcję soundex, tylko że w tym znaczeniu jakie tutaj chcesz powinieneś użyć "SOUNDS LIKE". Sama funkcja posiada pewne ograniczenia, ale to już zajrzyj do manuala.
Wiochi
Cytat(Mustava @ 16.01.2010, 23:05:06 ) *
Nie, w zapytaniu SQL (składni) nie możesz użyć bezpośrednio funkcji php np
  1. ....WHERE soundex(p.nazwisko) =....

- baza tego nie "skuma".

A kto mówi, że to chodzi o funkcję PHP?

  1. $query="SELECT * FROM baza1 p, baza2 c WHERE soundex(p.nazwisko) =".$nazw_soundex." AND c.id=p.miejsce ORDER BY nazwisko";

To zapytanie z pierwszego postu powinno działać. Możesz spokojnie używać funkcji mysql w klauzuli WHERE
wicy
Dzięki za podpowiedzi.
Faktycznie tak się szczęśliwie złożyło, że soundex jest funkcji i php, i mqsql, co przegapiłem.
Trochę ten mysql'owy soundex nie działa jak należy, ale to już inny problem
thek
Wiochi... A masz pewność, że soundex w PHP i MySQL używają tego samego algorytmu? Bo ja takiej nie mam smile.gif Zresztą w dokumentacji piszą, że tam jest używany podstawowy algorytm soundex, choć istnieją wersje zmodyfikowane, które dają inne rezultaty. Stąd to co daje php i mysql może się różnić. Dlatego prędzej użyłbym składni
WHERE pole SOUNDS LIKE '.$niesoundexowany_wyraz.' AND ...
bo to jest równoważne według dokumentacji z
WHERE soundex(pole) = soundex('.$niesoundexowany_wyraz.') AND ...
wicy
Właśnie zrodził się kolejny problem bo soundex php na pewno daje inne wyniki niż soundex mysql.

WHERE pole SOUNDS LIKE '.$niesoundexowany_wyraz.' daje dokładnie takie same wyniki jak WHERE soundex(pole) = soundex('.$niesoundexowany_wyraz.'). Nie jestem jednak w stanie określić poprawności wyników ani stwierdzić czy poprawniej działa php, czy mysql sad.gif
thek
Nie martw się tym... Dla języka polskiego i tak oba nie będą działać prawidłowo. Tak naprawdę tylko język angielski w tej funkcji jest porządniej zaimplementowany. Każdy inny będzie działał gorzej. Dlatego zastosuj wariant gdzie masz pewność, że porównanie dla tego samego wyrazu da ten sam wynik. A że php i mysql dla tego samego mogą dać inny rezultat to nie mieszaj PHP z MySQL tylko użyj SOUNDS LIKE smile.gif Może i wyniki dla naszego języka nie są takie jak można by oczekiwać, ale masz choć jakieś działające rozwiązanie w miarę sie sprawdzające. Lepsze to niż nic...
Wiochi
Cytat(thek @ 17.01.2010, 00:27:11 ) *
Wiochi... A masz pewność, że soundex w PHP i MySQL używają tego samego algorytmu? Bo ja takiej nie mam smile.gif Zresztą w dokumentacji piszą, że tam jest używany podstawowy algorytm soundex, choć istnieją wersje zmodyfikowane, które dają inne rezultaty. Stąd to co daje php i mysql może się różnić. Dlatego prędzej użyłbym składni
WHERE pole SOUNDS LIKE '.$niesoundexowany_wyraz.' AND ...
bo to jest równoważne według dokumentacji z
WHERE soundex(pole) = soundex('.$niesoundexowany_wyraz.') AND ...


Fakt, pewności nie mam. Ale akurat soundex(Wiochi) zwraca taką samą wartość w PHP i MySQL.

Zresztą jak już zostało powiedziane soundex to słabe rozwiązanie. Ja parę razy go użyłem a potem musiałem zmieniać. Niestety wyniki potrafiły być bardzo nieprzewidywalne w stosunku do oczekiwań.
thek
Niestety problem w tym, że język polski różni się od angielskiego. By było to podobne to musiałbyś chyba implementować funkcję konwertującą słowa w zapisie z języka pisanego do fonemów. Nie jest to może specjalnie trudny algorytm,ale wymaga już znajomości języka polskiego pod tym kątem by dokonać owej konwersji wtedy "jesz" i "jeż" będą fonetycznie jednoznaczne smile.gif Ale jak wspomniałem... Musisz sam napisać tę funkcję.Ja kiedyś zrobiłem ją bo mi była potrzebna do syntezatoramowy. Szkoda, że już nie posiadam tego na dysku bo bym wrzucił.
wicy
Problem w tym, że nie tylko polski różni się od angielskiego a baza zawiera nazwiska nie tylko polskie, ale np. czeskie, chorwackie, niemieckie. W tym układzie nawet pisanie własnych funkcji podmieniającej znaki dla php'owego soundexa chyba nic nie da, bo należałoby wiedzieć jakiej narodowości nazwisko się koduje. Jak podejść do rozpoznawania i kodowania znaków w trakcie wykonania zapytania do SQL, zupełnie nie mam pojęcia. Chyba w momencie zapisu nazwiska do bazy musiało by być ono najpierw "doprowadzone" do angielskiej formy w dodatkowym polu i po tym polu wyszukiwane mysql'owym soundexem.
Dopler
Ja również się borykam z funkcją SOUNDS LIKE
Wyniki owszem jakieś wychodzą - ale użyteczność marna.
Moja baza składa się z informacji archiwalnej o osobach żyjących w XIX wieku na terenach polskich - a więc zapisywanych przez różnych zaborców
w rekordach mogę więc mieć więc np. Szewski, Shewskij, Shevskyj - różnica jest S200 - S120. (Przy słowach np. Lee i Leij - różnica jest S00 i S220)
W efekcie wyników mam masę. 80% kompletnie bezużytecznych, a połowa potrzebnych jest pomijana.

Generalnie jest szansa aby taką funkcję dla języka polskiego i jego transliteracji w miarę dobrze zrobić. Ta funkcja musiała by jednak operować przede wszystkim na zgłoskach i chyba najlepszym systemem było by zapisywać wynik od razu w tabeli w osobnym polu. Tu jednak warunkiem jest wprowadzanie rekordów ręcznie. Bo jeśli się wrzuca całą listę CSV to system automatycznie rekordów nie przetworzy. Przy wielu tysiącach jest to niezmiernie uciążliwe.

Czy wciąż nie ma jakiś innych systemów przeliczania niż SOUNDEX ?
viking
Użyj Lucene i powinno być z głowy.
Dopler
Cytat(viking @ 21.05.2012, 11:53:25 ) *
Użyj Lucene i powinno być z głowy.


w zapytaniu MSQL questionmark.gif?
viking
Możesz użyć soundex który nie został stworzony z myślą o nie anglosaskich dialektach, albo lucene który radzi sobie doskonale w większości przypadków. Zapytanie dla lucene sprowadza się do zaindeksowania gotowych treści więc, odpowiadając na pytanie, w zapytaniu SQL ;P
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.