Hãy xem xét một số yếu tố đầu vào có thể:
John
Smith
John Smith
truy vấn mẫu ban đầu của bạn là:
SELECT * FROM people
WHERE
firstname LIKE '%user_submitted_data%' OR
lastname LIKE '%user_submitted_data%'
Bây giờ, khi người dùng nhập vào các đầu vào đầu tiên , truy vấn này sẽ chọn tất cả những người có tên đầu tiên chứa 'John'; nó cũng sẽ chọn tất cả những người có họ chứa 'John' (ví dụ, tất cả các Johnsons trong cơ sở dữ liệu). Tương tự, đầu vào thứ hai sẽ chọn tất cả những người có tên đầu tiên chứa 'Smith'; nó cũng sẽ chọn tất cả những người có họ cuối cùng chứa 'Smith' (ví dụ, Smithsons và Smithers). Càng xa càng tốt; nó không phải là hoàn hảo vì các vấn đề nhạy cảm với trường hợp (tôi sẽ bỏ qua trường hợp nhạy cảm từ đây, nhưng bạn có lẽ không nên bỏ qua nó ở tất cả), nhưng nó sẽ là OK.
Thông tin đầu vào thứ ba sẽ chỉ chọn những người có tên đầu tiên chứa 'John Smith'; nó cũng sẽ chọn những người có tên cuối cùng chứa 'John Smith'. Tuy nhiên, có khả năng là có rất ít người đáp ứng được các tiêu chí đó - những người được gọi là John Smith sẽ chỉ có John trong tên và Smith trong họ. Đây không phải là những gì bạn có trong tâm trí.
Không rõ liệu bạn có một cột được gọi là 'tên đầy đủ' trong bảng hay không. Nếu bạn làm như vậy, bạn có thể đối sánh với cột đó thay vì khớp với tên và họ riêng biệt. Nếu bạn không, có thể bạn có thể sản xuất một cột như vậy và sau đó chạy truy vấn đối với điều đó.
SELECT *
FROM (SELECT firstname || ' ' || lastname AS fullname, ... FROM people) AS t
WHERE t.fullname LIKE '%user_submitted_data%'
Điều này hoạt động khá tốt.
Tuy nhiên, nếu bạn lo lắng về các tên như 'Charles De Gaulle' (hoặc 'Charles de Gaulle') hoặc 'Michael van den Berg'), thì sự trùng khớp sẽ thất bại nếu ai đó nhập 'Charles Gaulle' hoặc ' Michael Berg, hãy để một mình Michael Vandenberg. Có thể bạn sẽ cần phải thay thế bất kỳ ký tự dấu cách nào trong đầu vào của người dùng bằng ký hiệu '%'. Thậm chí sau đó, bạn phải đối mặt với vấn đề rằng các từ phải xuất hiện chính xác trình tự do người dùng đưa ra - điều này có thể không quan trọng, nhưng bạn nên quyết định một cách có ý thức rằng nó không quan trọng. Ví dụ: nếu đầu vào là 'Adam John Smith', thì truy vấn sẽ không bắt 'John Adam Smith'; nếu đầu vào là 'Smith, John', sau đó nó sẽ không nhận bất cứ ai (rất có thể).
Nếu bạn muốn quản lý điều này, bạn có thể cần phải mã hóa đầu vào của người dùng và tìm kiếm trên các từ riêng biệt.Cẩn thận với ai đó hỏi về một chuỗi con của một từ (ví dụ, ai đó hỏi về 'de' như một từ tên) - không có truy vấn nào tại thời điểm này đảm bảo rằng từ nhập của người dùng khớp với toàn bộ các từ trong các giá trị (John vs Johnson), và làm như vậy với toán tử LIKE chuẩn SQL là gần đủ không thể.
Cảm ơn bạn đã khắc phục. – Jimmy