Tôi hiện đang có một lĩnh vực tìm kiếm duy nhất tìm kiếm đối với nhiều cột sử dụng mã này:Làm thế nào để thực hiện một tìm kiếm cột mysql toàn văn nhiều nơi từ một phần được kết hợp
$searchArray = explode(" ", $searchVal);
$query="SELECT * FROM users WHERE ";
$i=0;
foreach ($searchArray as $word) {
if ($i != 0) $query .= " OR ";
$query .= " MATCH (`first_name`, `last_name`, `email`) AGAINST ('".$word."*' IN BOOLEAN MODE)";
$i++;
}
phép nói rằng tôi có hai hàng này trong bảng:
id | last_name | first_name | email
1 | Smith | John | [email protected]
2 | Smith | Bob | [email protected]
Nếu tôi nhập "John S", chỉ kết quả đầu tiên cho thấy hành vi mong muốn.
Nếu tôi nhập "John Smith", chỉ kết quả đầu tiên cho biết hành vi mong muốn là gì.
Nếu tôi nhập "Smith J", cả hai kết quả sẽ hiển thị mặc dù Bob không khớp.
Nếu tôi nhập "Smith John", cả hai kết quả sẽ hiển thị mặc dù Bob không khớp.
Cuối cùng, nếu tôi nhập "Jo S", không có kết quả nào được trả về mặc dù kết hợp từng phần trên "Jo" và "S".
Bất kỳ ai có thể giúp tôi khắc phục truy vấn của mình để xử lý chức năng mong muốn của đơn đặt hàng không phải là kết quả quan trọng và một phần phù hợp không? Nếu nó có thể được sắp xếp theo các kết quả phù hợp nhất (tức là phần dài nhất của từ, bắt đầu từ chữ cái đầu tiên không chỉ là một phần ở giữa, ở số cột cao nhất), đó cũng sẽ là một trợ giúp lớn.
UPDATE:
Chỉ muốn gửi mã thức mà làm việc dựa trên các giải pháp. Vòng lặp của tôi tạo nhiều câu lệnh trùng khớp không chính xác như là ft_min_word_len của tôi.
Mã của tôi bây giờ là:
$searchArray = explode(" ", $searchVal);
$query="SELECT * FROM users WHERE MATCH (`first_name`, `last_name`, `email`) AGAINST ('";
$i=0;
foreach ($searchArray as $word) {
$query .= "+".$word."* ";
}
$query .= "' IN BOOLEAN MODE)";
Dường như vẫn có vấn đề với thứ tự các điều khoản. Tôi đã thêm Pablo Picasso vào DB để lấy tên dài hơn để thử nghiệm.Thuật ngữ "Pablo Pica" trả về kết quả. "Pica Pablo" thì không. Tôi có nên chuyển toàn bộ các cụm từ với dấu + và dấu * vào một câu lệnh MATCH duy nhất hoặc thực hiện nhiều câu lệnh MATCH với một OR như tôi có ở trên không? – Max
@Max: Tôi không thể tạo lại điều này, cả 'Pica Pablo' là' Pablo Pica' (hoặc '+ Pica * + Pablo *'/'+ Pablo * + Pica *') trả về cùng một người dùng cho tôi. Có, trong một câu lệnh 'MATCH() AGAINST()' duy nhất. Mỗi thuật ngữ đơn lẻ trong 'MATCH()' rất có thể sẽ yêu cầu định dạng '+ term *'. Do đọc bình luận của @ PatrickB mặc dù: tên <4 ký tự sẽ không bao giờ khớp. – Wrikken
Cảm ơn! Sự kết hợp của ft_min_word_len và thay đổi nó thành một câu lệnh MATCH đã sửa nó. Tôi sẽ cập nhật câu hỏi bằng mã cuối cùng của mình. – Max