तार्किक AND/OR
. का उपयोग करके आप अपने दूसरे प्रयास के साथ सही रास्ते पर हैं CASE
. के बजाय समूहीकरण , लेकिन अगर आप पसंद करना . करना चाहते हैं cmp_brand
. से मेल खाने वाली पंक्ति एक खाली cmp_brand
. के साथ पंक्तियों के ऊपर और केवल एक परिणाम की उम्मीद करें, अपने ORDER BY
की संरचना करें गैर-रिक्त cmp_brand
को सॉर्ट करने के लिए पहले, और समग्र परिणाम को 1 तक सीमित करें।
SELECT thumb
FROM inf_brand_images
WHERE
is_active=1 AND
((cmp_brand = '' AND brand='NIKE') OR (cmp_brand='123_NIKE'))
/* non-empty cmp_brand will sort first */
ORDER BY cmp_brand <> '' DESC
/* and the end result is limited only to the first sorted row
which will be the cmp_brand if matched, or the brand otherwise */
LIMIT 1
http://sqlfiddle.com/#!2/d176b/2
यह काम करता है क्योंकि अभिव्यक्ति cmp_brand <> ''
बूलियन का मूल्यांकन करता है true/false
, जिसे MySQL 1/0
. के रूप में व्याख्या करता है . उन मानों पर एक अवरोही क्रम गैर-खाली लोगों को मुट्ठी सॉर्ट करने के लिए मजबूर करता है (1 से पहले 0)।
टिप्पणियों के बाद अपडेट करें:
चूंकि आपके पास एक से अधिक पंक्तियों के वापस आने की संभावना है, आप ORDER BY
पर भरोसा नहीं कर सकते . इसके बजाय, आप एक LEFT JOIN
कर सकते हैं उसी टेबल के खिलाफ एक तरफ, cmp_brand = ''
. का मिलान करें और दूसरी तरफ मैच cmp_brand = '123_NIKE'
. महत्वपूर्ण रूप से, thumb
वापस करें दोनों . से कॉलम शामिल होने के पक्ष।
इसे FROM
. में एक सबक्वेरी में लपेटें खंड, फिर शीर्ष स्तर पर आप एक SELECT CASE
का उपयोग कर सकते हैं cmp_brand
को प्राथमिकता देने के लिए अगर खाली नहीं है।
SELECT DISTINCT
CASE WHEN cbcb IS NOT NULL THEN cbthumb ELSE bthumb END AS thumb
FROM (
/* Return thumbs from both sides of the join */
SELECT
b.thumb AS bthumb,
b.cmp_brand AS bcb,
cb.thumb AS cbthumb,
cb.cmp_brand AS cbcb
FROM
inf_brand_images b
/* join the table against itself with the matching cmp_brand in the join condition */
LEFT JOIN inf_brand_images cb
ON b.brand = cb.brand
AND cb.cmp_brand = '123_NIKE'
WHERE
/* The WHERE clause looks for empty cmp_brand on the left side of the join */
b.brand = 'NIKE' AND b.cmp_brand = ''
) thumbs
- यहां एक उदाहरण दिया गया है जहां 123_NIKE मेल खाता है:http://sqlfiddle.com/#! 2/dfe228/31
- और एक उदाहरण जहां 124_NIKE मेल नहीं खाता:http://sqlfiddle.com/# !2/dfe228/32