Bạn đang đi đúng hướng với lần thử thứ hai, sử dụng AND/OR
logic các nhóm thay vì CASE
, nhưng nếu bạn muốn thích hàng khớp với cmp_brand
trên các hàng có cmp_brand
trống và chỉ mong đợi một kết quả trả về, hãy cấu trúc ORDER BY
của bạn để sắp xếp cmp_brand
không trống đầu tiên và giới hạn kết quả tổng thể là 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
Điều này hoạt động vì biểu thức cmp_brand <> ''
đánh giá thành boolean true/false
, MySQL hiểu là 1/0
. Sắp xếp giảm dần trên các giá trị đó buộc các giá trị không trống phải sắp xếp thành nắm đấm (1 trước 0).
Cập nhật sau nhận xét:
Vì bạn có khả năng trả về nhiều hơn một hàng, bạn không thể dựa vào ORDER BY
. Thay vào đó, bạn có thể thực hiện LEFT JOIN
so với cùng một bảng. Ở một bên, khớp với cmp_brand = ''
và ở phía bên kia khớp với cmp_brand = '123_NIKE'
. Quan trọng, hãy trả lại thumb
cột từ cả hai các mặt của sự tham gia.
Kết thúc điều đó trong một truy vấn con trong FROM
, thì ở cấp cao nhất, bạn có thể sử dụng SELECT CASE
thích cmp_brand
nếu không có gì.
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
- Đây là một ví dụ trong đó 123_NIKE đối sánh: http://sqlfiddle.com/#! 2 / dfe228/31
- Và một ví dụ trong đó 124_NIKE không khớp: http://sqlfiddle.com/# ! 2 / dfe228/32