Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MYSQL] Wyszukiwanie likiem w wielu kolumnach
Forum PHP.pl > Forum > Przedszkole
Zwariowany
Mam w tabeli trzy kolumny. Imię, nazwisko, nick. Np. Jan, Kowalski, Kowal. I teraz moje pytanie. Jeżeli użytkownik chcę go znaleźć i wpisuje w wyszukiwarkę Jan Kowalski Kowal, to jak zrobić, żeby like dotyczyło wszystkim kolumn i dopasowywało fragment z tego kodu? bo takie coś to niestety nie działa:

SELECT * FROM `users` WHERE (`imie` LIKE 'Jan Kowalski Kowal') OR (`nazwisko` LIKE 'Jan Kowalski Kowal') OR (`nick` LIKE 'Jan Kowalski Kowal')
wookieb
to nie jest takie proste.
Zrob sprytny kod który ci to ułatwi
1) rozbije ciag na słowa
2) wstawi te slowa do poszczegolnych kolumn w takiej postaci
[sql]
pole LIKE '%slowo1%' OR pole like '%slowo2%' itd

przydatne funkcje
http://php.net/explode - rozbijanie na slowa
http://php.net/implode - warunki wrzucasz do tablicy ktore potem laczysz ciagem ' OR '
Zwariowany
Już próbowałem rozbijać, ale doszedłem do wniosku, że jeżeli użytkownik np wpiszę: Jan Kowalski Janek pogromca czarnych jajek. To co wtedy? już nie będzie tak łatwo, że to rozbiję, bo nie wiem ile będzie słów, dlatego szukam jakiegoś innego rozwiązania.
wookieb
musisz ograniczyc uzytkownikowi ilsoc znakow albo słow. to juz zalezy od ciebie. ta metoda jest najprostsza pomijajac wyszukiwanie pełnotekstowe (fulltext)
Zwariowany
uznałem, że 5 słów to najwięcej ile może być sprawdzane ze wszystkimi polami: oto kod dla imie i nazwisko 

  1. <?php
  2. if ($ile == '1')
  3. {
  4. $poczatek.=' `imie` LIKE '%'.$eksplode[0].'%'';
  5. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[0].'%'';
  6. }
  7.  
  8. if ($ile == '2')
  9. {
  10. $poczatek.=' `imie` LIKE '%'.$eksplode[0].'%'';
  11. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[0].'%'';
  12. $poczatek.=' OR `imie` LIKE '%'.$eksplode[1].'%'';
  13. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[1].'%'';
  14. }
  15.  
  16. if ($ile == '3')
  17. {
  18. $poczatek.=' `imie` LIKE '%'.$eksplode[0].'%'';
  19. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[0].'%'';
  20. $poczatek.=' OR `imie` LIKE '%'.$eksplode[1].'%'';
  21. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[1].'%'';
  22. $poczatek.=' OR `imie` LIKE '%'.$eksplode[2].'%'';
  23. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[2].'%'';
  24. }
  25.  
  26. if ($ile == '4')
  27. {
  28. $poczatek.=' `imie` LIKE '%'.$eksplode[0].'%'';
  29. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[0].'%'';
  30. $poczatek.=' OR `imie` LIKE '%'.$eksplode[1].'%'';
  31. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[1].'%'';
  32. $poczatek.=' OR `imie` LIKE '%'.$eksplode[2].'%'';
  33. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[2].'%'';
  34. $poczatek.=' OR `imie` LIKE '%'.$eksplode[3].'%'';
  35. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[3].'%'';
  36. }
  37.  
  38. if ($ile == '5')
  39. {
  40. $poczatek.='`imie` LIKE '%'.$eksplode[0].'%'';
  41. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[0].'%'';
  42. $poczatek.=' OR `imie` LIKE '%'.$eksplode[1].'%'';
  43. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[1].'%'';
  44. $poczatek.=' OR `imie` LIKE '%'.$eksplode[2].'%'';
  45. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[2].'%'';
  46. $poczatek.=' OR `imie` LIKE '%'.$eksplode[3].'%'';
  47. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[3].'%'';
  48. $poczatek.=' OR `imie` LIKE '%'.$eksplode[4].'%'';
  49. $poczatek.=' OR `nazwisko` LIKE '%'.$eksplode[4].'%'';
  50. }
  51. ?>
wookieb
to wcale nie jest sprytny skrypt...
  1. <?php
  2. $fields=array('imie', 'nazwisko');
  3.  
  4. $where=array();
  5.  
  6. // wywalamy puste "słowa"
  7. $slowa=array_filter($slowa, 'trim');
  8.  
  9. // jezeli jest za duzo słow to bierzemy tylko nasze 5
  10. if(count($slowa)>5) $slowa=array_slice($slowa, 0, 5);
  11.  
  12. foreach($slowa as $slowo)
  13. {
  14.    foreach($fields as $field)
  15.    {
  16.        $where[]=$field.' LIKE '%'.mysql_real_escape_string($slowo).'%'';
  17.    }
  18. }
  19.  
  20. $twojeWhere=implode(' OR ',$where);
  21. ?>

Czyż nie łatwiej + bezpieczniej + efektywniej

Ja rozumiem początkujący etap ale podałem ci link do implode który jest bardzo dużym ułatwieniem
Zwariowany
Ale tutaj nawet na początku zapytania na wstępie wywali OR a przecież pierwszy `name` nie może być z OR 
wookieb
Sprawdź a potem mów.
Twój post oznacza, że nadal nie przeczytałeś o implode...
planet
implode wstawia OR pomiędzy wyrazy, analogicznie z tego co piszesz należałoby sądzić, że po ostatnim parametrze też doda OR a tak nie jest. kod, który podał wookieb na pewno jest poprawny.
rama
Cytat(Zwariowany @ 18.07.2009, 21:40:44 ) *
SELECT * FROM `users` WHERE (`imie` LIKE 'Jan Kowalski Kowal') OR (`nazwisko` LIKE 'Jan Kowalski Kowal') OR (`nick` LIKE 'Jan Kowalski Kowal')


Innym sposobem jest złączenie "kolumn" poprzez funkcję CONCAT, chociaż rozwiązanie to może być kosztowne.
  1. SELECT * FROM `users` WHERE CONCAT(`imie`,`nazwisko`,`nick`) LIKE '%wyrazenie_szukane%';
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.