OR
स्थितियां जब एक ही फ़ील्ड या श्रेणी आधारित नहीं होती हैं (जैसे <
, >
, LIKE
) वास्तव में अनुक्रमित का लाभ उठाने के लिए MySQL की क्षमता को कम करता है; आप उन्हें अलग-अलग सरल लोगों में तोड़कर प्रश्नों को पुन:व्यवस्थित कर सकते हैं जिन्हें आप यूनियन कर सकते हैं। इसे इस तरह अलग करना MySQL को UNIONs के भीतर प्रत्येक क्वेरी की एक अलग अनुक्रमणिका का लाभ उठाने की अनुमति देता है
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%'
;
साथ ही, ध्यान दें कि मैंने पिछले वाले के जॉइन को एक इनर में बदल दिया है क्योंकि बाएं जॉइन की दाहिनी ओर टेबल पर कोई भी शर्त (जो "उस टेबल से मैच के बिना नहीं है") मूल रूप से एक इनर जॉइन है।
UNION DISTINCT
कई शर्तों को पूरा करने वाले रिकॉर्ड को दोहराने से रोकने के लिए उपयोग किया जाता है, हालांकि... यदि companies.company
अद्वितीय नहीं है (अर्थात कंपनी आईडी 1 जिसे "ब्ला" कहा जाता है और कंपनी आईडी 12 को "ब्लाह" भी कहा जाता है) तो उन्हें भी विलय कर दिया जाएगा जहां वे आपकी मूल क्वेरी में नहीं होंगे; यदि यह एक संभावित समस्या है, तो प्रत्येक SELECT
में company_id को शामिल करके भी इसका समाधान किया जा सकता है ।