OR
Bedingungen, wenn sie nicht auf demselben Feld oder Bereich basieren (z. B. <
, >
, LIKE
) verringern die Fähigkeit von MySQL, Indizes zu nutzen, wirklich; Sie können Abfragen neu strukturieren, indem Sie sie in einzelne, einfachere Abfragen zerlegen, die Sie dann VEREINIGEN können. Durch diese Trennung kann MySQL einen anderen Index für jede Abfrage innerhalb der UNIONs nutzen
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%'
;
Beachten Sie auch, dass ich den JOIN des letzten in einen INNER geändert habe, da jede Bedingung auf der rechten Tabelle eines LEFT JOIN (das heißt nicht „ohne Übereinstimmung aus dieser Tabelle“) im Grunde sowieso ein INNER JOIN ist.
UNION DISTINCT
wird verwendet, um zu verhindern, dass Datensätze wiederholt werden, die mehrere Bedingungen erfüllen, aber ... wenn companies.company
nicht eindeutig ist (d. h. Firmen-ID 1 mit dem Namen "Blah" und Firmen-ID 12 mit dem Namen "Blah"), dann werden diese auch dort zusammengeführt, wo sie in Ihrer ursprünglichen Abfrage nicht enthalten wären; Wenn es sich um ein potenzielles Problem handelt, kann das behoben werden, indem auch company_id in jedes SELECT
aufgenommen wird .