簡體   English   中英

通過mysql在組中選擇唯一值(基於兩列)

[英]Select unique values(based on two columns) in group by mysql

我是SQL新手。 我已經在MySQL中編寫了以下查詢

select * from msgs where (msgs.toid = 1 or msgs.fid = 1) group by fid,toid;

該查詢返回值,如下所示。

|message_id | toid | fid |
    68          4     1 
    70          1     9
    72          1     4
    78          5     1
    80          9     1

我的預期結果應該是

|message_id | toid | fid |
    72          1     4
    78          5     1
    80          9     1

這意味着我不應該得到重復的值(基於兩列值toid,fid),它應該是最高的id值。

toid和fid的組合應該是唯一的。

您可以使用greatest(),least()來檢查是否不存在具有相同ID和更高消息ID的另一行(這意味着所選行具有給定組合的最高消息ID)。

select * from msgs m where (toid = 1 or fid = 1)
and not exists (
    select 1 from msgs m2
    where greatest(m2.toid,m2.fid) = greatest(m.toid,m.fid)
    and least(m2.toid,m2.fid) = least(m.toid,m.fid)
    and m2.message_id > m.message_id
)

編輯-使用row_number()另一種方法

select * from (
    select * , 
        row_number() over (partition by greatest(toid,fid),
          least(toid,fid) order by message_id desc) rn
    from msgs m where (toid = 1 or fid = 1)
) t1 where rn = 1

您也可以嘗試一下。

select * from msgs m 
        where (toid = 1 or fid = 1)
          and not exists ( select 1 from msgs m2
                                   where (m2.toid + m2.fid) = (m.toid + m.fid)
                                     and m2.message_id > m.message_id
                         )
SELECT *
FROM msgs m
WHERE NOT EXISTS (  SELECT 'a'
                    FROM msgs m2
                    WHERE m2.msg_id > m.msg_id
                    AND (
                          (  m.toid = m2.toid
                             AND m.fid = m2.fid
                          )
                        OR ( m.toid = m2.fid
                             AND m.fid = m2.toid
                          )
                        )
                   )
AND (m.toid = 1 OR m.fid = 1)

返回兩個用戶之間進行對話的最新消息

您可以使用以下查詢:

SELECT
  MAX(message_id) AS message_id,
  LEAST(toid, fid) AS toid,
  GREATEST(toid, fid) AS fid
FROM
  msgs
GROUP BY
  LEAST(toid, fid) AS toid,
  GREATEST(toid, fid) AS fid

是的,它將返回例如

80    1    9

代替

80    9    1

但由於(1,9)等效於(1,9) (9, 1)所以應該沒有問題。 如果是,請參見FuzzyTree的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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