ELLER
betingelser, når de ikke er baseret på det samme felt eller område (såsom <
). , > ,
LIKE
) virkelig mindske MySQL's evne til at drage fordel af indekser; du kan omstrukturere forespørgsler ved at opdele dem i separate enklere forespørgsler, som du derefter kan UNION. Ved at adskille det på denne måde kan MySQL drage fordel af et forskelligt indeks for hver forespørgsel i UNION'erne
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%'
;
Bemærk også, at jeg ændrede den sidstes JOIN til en INNER, da en hvilken som helst betingelse på bordet til højre for en LEFT JOIN (det er ikke "uden en match fra den tabel") grundlæggende er en INNER JOIN alligevel.
UNION DISTINCT
bruges til at forhindre registreringer, der opfyldte flere betingelser, i at blive gentaget, men... hvis virksomheder.virksomhed
er ikke unik (dvs. virksomheds-id 1 kaldet "Blah" og virksomheds-id 12 også kaldet "Blah"), så vil disse også blive flettet, hvor de ikke ville være i din oprindelige forespørgsel; hvis det er et potentielt problem, kan det afhjælpes ved også at inkludere virksomheds-id i hver SELECT
.