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