我有这样的表
message_id | sender_id | recipient_id | message 6 677 681 message 0 7 677 678 message 1 9 677 678 message 2 10 677 681 message 3 11 677 698 message 4 12 678 677 message 5
我想只使用一个参数将sender_id和recipient_id组合在一起。例如,我想选择与user_id 677表相关的行,如下所示;
message_id | sender_id | recipient_id | message 10 677 681 message 3 11 677 698 message 4 12 678 677 message 5
我一直在研究它几个小时,但我没有得到预期的结果。
答案 0 :(得分:3)
这是一个解决方案
SELECT *
FROM message
WHERE message_id
IN (SELECT MAX(message_id)
FROM message
GROUP BY CASE WHEN sender_id < recipient_id
THEN CONCAT(CONCAT(sender_id, ','), recipient_id)
ELSE CONCAT(CONCAT(recipient_id, ','), sender_id)
END)
ORDER BY message_id ;
它只是获取sender_id和recipient_id之间的组合键,以使用group by查找不同的记录。
这里的SQL小提琴演示 - http://sqlfiddle.com/#!9/9df65c/11
希望这有帮助
答案 1 :(得分:0)
尝试一下......我不是MySQL,但我认为这对你有用。
Select Max(Message_ID), Sender_ID, Recipient_ID, Max(Message)
From Table
Where Sender_ID = 677 OR Recipient_ID = 677
Group By Sender_ID, Recipient_ID
答案 2 :(得分:0)
您可以这样做:
select m.*
from messages m
where m.message_id = (select max(m2.message_id)
from messages m2
where (m2.sender_id, m2.receipient_id) in ( (m.sender_id, m.receipient_id), (m.receipient_id, m.sender_id) )
) and
677 in (m.sender_id, m.receipient_id);
答案 3 :(得分:0)
create table #message
(message_id int null,
sender_id int null,
recipient_id int null,
message nchar(10) null )
insert into #message(message_id,sender_id,recipient_id,message)
values
(6,677,681,'message 0'),
(7,677,678,'message 1'),
(9,677,678,'message 2'),
(10,677,681,'message 3'),
(11,677,698,'message 4'),
(12,678,677,'message 5');
SELECT message_id,sender_id,recipient_id,message
FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY sender_id,recipient_id ORDER BY sender_id DESC) 'RowDistinctNumber'
FROM #message
)sub
WHERE RowDistinctNumber = 1
message_id sender_id recipient_id message
----------- ----------- ------------ ----------
7 677 678 message 1
10 677 681 message 3
11 677 698 message 4
12 678 677 message 5
(4 row(s) affected)