[英]MySQL Select unique record based on priority logic
我有帶有以下列的表ITEM:ID,狀態,哈希,值。 如果我有以下記錄:
1, "NEW", 111111, "value1"
2, "BOOKMARKED", 111111, "value2"
3, "PREPARING", 111111, "value3"
4, "NEW", 222222, "value4"
5, "BOOKMARKED", 222222, "value5"
6, "NEW", 333333, "value6"
我需要使用以下邏輯獲取記錄:如果HASH列相同,則僅返回一條記錄。 “ PREPARING”優先於“ BOOKMARKED”,“ BOOKMARKED”優先於“ NEW”。
因此查詢結果將返回:
3, "PREPARING", 111111, "value3"
5, "BOOKMARKED", 222222, "value5"
6, "NEW", 333333, "value6"
謝謝。
一種方法是根據規則枚舉值,然后采用第一個值:
select t.*
from (select t.*,
(@rn := if(@h = hash, @rn + 1,
if(@h := hash, 1, 1)
)
) as rn
from t cross join
(select @rn := 0, @h := '') params
order by hash,
field(status, 'PREPARING', 'BOOKMARKED', 'NEW')
) t
where rn = 1;
這是可行的,您可以更改案例結構的優先級:
select `ITEM`.*
from `ITEM`
inner join
(
SELECT `ITEM`.`hash`,
max(
CASE `ITEM`.`status`
WHEN 'PREPARING' THEN 2
WHEN 'BOOKMARKED' THEN 1
ELSE 0
END
) as `g`
FROM `ITEM`
group by `ITEM`.`hash`
) as `t` ON
`t`.`hash` = `ITEM`.`hash` AND
`t`.`g` = (
CASE `ITEM`.`status`
WHEN 'PREPARING' THEN 2
WHEN 'BOOKMARKED' THEN 1
ELSE 0
END
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.