OR
kondisi saat tidak berdasarkan bidang atau rentang yang sama (seperti <
, >
, LIKE
) benar-benar menurunkan kemampuan MySQL untuk memanfaatkan indeks; Anda dapat menyusun ulang kueri dengan memecahnya menjadi kueri terpisah yang lebih sederhana yang kemudian dapat Anda UNION. Memisahkannya seperti ini memungkinkan MySQL untuk memanfaatkan indeks yang berbeda dari setiap kueri dalam UNION
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%'
;
Juga, perhatikan bahwa saya mengubah JOIN yang terakhir menjadi INNER karena kondisi apa pun di tabel sebelah kanan LEFT JOIN (yang bukan "tanpa kecocokan dari tabel itu") pada dasarnya adalah INNER JOIN.
UNION DISTINCT
digunakan untuk mencegah pengulangan record yang memenuhi beberapa kondisi, namun... jika companies.company
tidak unik (yaitu id perusahaan 1 disebut "Blah" dan id perusahaan 12 juga disebut "Blah") maka itu juga akan digabungkan di tempat yang tidak ada dalam kueri asli Anda; jika ini merupakan masalah potensial, itu dapat diatasi dengan menyertakan juga company_id di setiap SELECT
.