Anda berada di jalur yang benar dengan upaya kedua, menggunakan AND/OR
yang logis pengelompokan alih-alih CASE
, tetapi jika Anda ingin lebih suka baris yang cocok dengan cmp_brand
di atas baris dengan cmp_brand
yang kosong dan hanya mengharapkan satu hasil kembali, susun ORDER BY
your Anda untuk mengurutkan cmp_brand
yang tidak kosong pertama, dan batasi hasil keseluruhan menjadi 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
Ini berfungsi karena ekspresi cmp_brand <> ''
mengevaluasi ke boolean true/false
, yang ditafsirkan MySQL sebagai 1/0
. Pengurutan menurun pada nilai tersebut memaksa nilai yang tidak kosong untuk mengurutkan kepalan tangan (1 sebelum 0).
Perbarui setelah komentar:
Karena Anda memiliki kemungkinan lebih dari satu baris dikembalikan, Anda tidak dapat mengandalkan ORDER BY
. Sebagai gantinya, Anda dapat melakukan LEFT JOIN
terhadap meja yang sama. Di satu sisi, cocokkan cmp_brand = ''
dan di sisi lain cocokkan cmp_brand = '123_NIKE'
. Yang penting, kembalikan thumb
kolom dari keduanya sisi gabungan.
Bungkus itu dalam subquery di FROM
klausa, maka di tingkat atas Anda dapat menggunakan SELECT CASE
untuk memilih cmp_brand
jika tidak kosong.
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
- Berikut adalah contoh di mana 123_NIKE cocok:http://sqlfiddle.com/#! 2/dfe228/31
- Dan contoh di mana 124_NIKE tidak cocok:http://sqlfiddle.com/# !2/dfe228/32