2012-04-04 14 views
5

Mam tabelę Użytkownik, który ma pola (id, nazwa pierwsza, nazwa pośrednia, nazwa_ostatniej).Wyszukaj ciąg w wielu polach tabeli

Chcę napisać zapytanie, aby znaleźć użytkownika po jego imieniu. Może to być imię, drugie imię lub nazwisko.

$sql = "SELECT * FROM user 
     WHERE first_name like '%$name%' OR 
       middle_name like '%$name%' OR 
       last_name like '%$name%'"; 

Czy to wydajne zapytanie? (Pozostaw na razie problem z zabezpieczeniami).

+1

Czy to jest wydajne w porównaniu do czego? – Jon

+0

Zgodnie z tym komentarzem http://stackoverflow.com/questions/9986678/searching-more-than-1-column/9986696#comment12762483_9986696 UNION jest szybszy –

+0

@Jon Chcę uzyskać lepsze zapytanie do tego zadania. Nie mam z niczym porównania. –

Odpowiedz

3

Alter tabeli i dodać kompozytowego indeksu pełnotekstowego na First_name,second_name,last_name następnie użyć tej kwerendy

select * 
from table_name 
where match (`First_name`,`second_name`,`last_name`) against('name') 

to całkiem dużo szybciej niż zapytania.

1

Po dodaniu LIKE '%something%' do klauzuli WHERE wymuszenie skanowania tabeli. Więc tak, jest to nieefektywne, ale jedno lub trzy stwierdzenia nie zrobią dużej różnicy.

Skanowanie tabeli jest hitem o dużej wydajności.

Rozważ omówienie możliwości MySQL'a: Full Text Search. Został zaprojektowany, aby znacznie wydajniej odpowiadać na tego typu zapytania.

0

Jeśli chcesz wyszukać wzór w więcej niż jednym polu, a , jeśli masz uprawnienia do zmiany schematu tabeli, sugeruję implementację FULL-TEXT SEARCH.

Nadzieja to pomaga :)

Powiązane problemy