2012-04-04 54 views
5

Tôi có một bảng Người dùng có các trường (id, first_name, middle_name, last_name).Tìm kiếm một chuỗi trong nhiều trường của bảng

Tôi muốn viết truy vấn để tìm người dùng theo tên của anh ấy. Tên có thể là tên, họ đệm hoặc họ.

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

Truy vấn có hiệu quả không? (Để nguyên vấn đề bảo mật trong thời gian này.)

+1

Có hiệu quả khi so sánh với nội dung không? – Jon

+0

Theo nhận xét này http://stackoverflow.com/questions/9986678/searching-more-than-1-column/9986696#comment12762483_9986696 UNION nhanh hơn –

+0

@Jon Tôi muốn có một truy vấn tốt hơn để thực hiện tác vụ đó. Tôi không so sánh với bất cứ điều gì. –

Trả lời

3

bảng Alter và thêm chỉ mục toàn văn tổng hợp trên First_name,second_name,last_name sau đó sử dụng truy vấn này

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

Nó khá nhanh hơn nhiều sau đó truy vấn của bạn.

1

Ngay sau khi bạn có số LIKE '%something%' trong mệnh đề WHERE, bạn bắt buộc quét bảng. Vì vậy, có, nó là không hiệu quả, nhưng một hoặc ba tuyên bố LIKE sẽ làm cho sự khác biệt nhỏ.

Quét bảng là lần truy cập hiệu suất lớn.

Cân nhắc xem xét khả năng của Full Text Search của MySQL. Nó được thiết kế để trả lời kiểu truy vấn này hiệu quả hơn nhiều.

0

Nếu bạn cần tìm kiếm mẫu ở nhiều trường và nếu bạn có quyền thay đổi lược đồ bảng, tôi khuyên bạn nên triển khai FULL-TEXT SEARCH.

Hy vọng nó sẽ giúp :)

Các vấn đề liên quan