ИЛИ
условия, когато не се базират на едно и също поле или диапазон (като <
, >код> ,
Харесвам
) наистина намалява способността на MySQL да се възползва от индекси; можете да преструктурирате заявки, като ги разделите на отделни по-прости, които след това можете да UNION. Разделянето му по този начин позволява на MySQL да се възползва от различен индекс на всяка заявка в рамките на 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%'
;
Също така имайте предвид, че промених JOIN на последното на INNER, тъй като всяко условие в дясната таблица на LEFT JOIN (което не е „без съвпадение от тази таблица“) така или иначе е основно INNER JOIN.
UNION DISTINCT
се използва за предотвратяване на повтаряне на записи, които отговарят на множество условия, но... ако companies.company
не е уникален (т.е. фирмен идентификатор 1, наречен "Бла" и фирмен идентификатор 12, наречен също "Бла"), тогава те също ще бъдат обединени там, където не биха били в първоначалната ви заявка; ако е потенциален проблем, той може да бъде отстранен, като също така включите company_id във всеки SELECT
.