OR
podmínky, pokud nejsou ve stejném poli nebo rozsahu (jako například <
, >
, LIKE
) skutečně snížit schopnost MySQL využívat indexy; Dotazy můžete restrukturalizovat tak, že je rozdělíte na samostatné jednodušší, které pak můžete UNION. Oddělení tímto způsobem umožňuje MySQL využít výhody odlišného indexu každého dotazu v rámci 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%'
;
Všimněte si také, že jsem změnil JOIN posledního na INNER, protože jakákoli podmínka na pravém stole LEFT JOIN (to není "bez shody z tohoto stolu") je v podstatě stejně INNER JOIN.
UNION DISTINCT
se používá k zabránění opakování záznamů, které splňují více podmínek, nicméně... pokud companies.company
není unikátní (tj. id společnosti 1 s názvem „Blah“ a id společnosti 12 také s názvem „Blah“), pak budou sloučeny i tam, kde by ve vašem původním dotazu nebyly; pokud se jedná o potenciální problém, lze jej napravit tak, že do každého SELECT
zahrnete také company_id .