OR
các điều kiện khi không nằm trên cùng một trường hoặc dựa trên phạm vi (chẳng hạn như <
, >
, LIKE
) thực sự làm giảm khả năng của MySQL để tận dụng các chỉ mục; bạn có thể cấu trúc lại các truy vấn bằng cách chia nhỏ chúng thành các truy vấn riêng biệt đơn giản hơn mà bạn có thể UNION. Việc tách nó ra như vậy cho phép MySQL tận dụng chỉ mục khác nhau của mỗi truy vấn trong UNIONs
SELECT `u`.`user_id`, `c`.`company`
FROM `users` AS `u` LEFT JOIN `companies` AS `c` ON `c`.`user_id` = `u`.`user_id`
WHERE `u`.`user_id` = 'search_term'
UNION DISTINCT
SELECT `u`.`user_id`, `c`.`company`
FROM `users` AS `u` LEFT JOIN `companies` AS `c` ON `c`.`user_id` = `u`.`user_id`
WHERE `u`.`lname` LIKE 'search_term%'
UNION DISTINCT
SELECT `u`.`user_id`, `c`.`company`
FROM `users` AS `u` LEFT JOIN `companies` AS `c` ON `c`.`user_id` = `u`.`user_id`
WHERE `u`.`email` LIKE 'search_term%'
UNION DISTINCT
SELECT `u`.`user_id`, `c`.`company`
FROM `users` AS `u` INNER JOIN `companies` AS `c` ON `c`.`user_id` = `u`.`user_id`
WHERE `c`.`company` LIKE 'search_termeo%'
;
Ngoài ra, hãy lưu ý rằng tôi đã thay đổi JOIN cuối cùng thành INNER vì bất kỳ điều kiện nào trên bảng bên phải của LEFT JOIN (không phải là "không có khớp từ bảng đó") về cơ bản vẫn là INNER JOIN.
UNION DISTINCT
được sử dụng để ngăn các bản ghi thỏa mãn nhiều điều kiện bị lặp lại, tuy nhiên ... if companies.company
không phải là duy nhất (tức là id công ty 1 được gọi là "Blah" và id công ty 12 cũng được gọi là "Blah") thì những thứ đó cũng sẽ được hợp nhất khi chúng không có trong truy vấn ban đầu của bạn; nếu đó là một vấn đề tiềm ẩn, có thể được khắc phục bằng cách bao gồm cả company_id trong mỗi SELECT
.