論理的なAND/OR
を使用して、2回目の試行で正しい方向に進んでいます。 CASE
の代わりにグループ化 、ただし、優先したい場合 cmp_brand
に一致する行 cmp_brand
が空の行 結果が1つだけ返されることを期待して、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
として解釈します 。これらの値を降順で並べ替えると、空でない値は最初に並べ替えられます(0の前に1)。
コメント後に更新:
複数の行が返される可能性があるため、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