簡體   English   中英

MySQL根據優先級邏輯選擇唯一記錄

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM