两列独特的组合

问题描述 投票:3回答:4

我有这样的桌子

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

我已经工作了几个小时,但没有得到预期的结果。

mysql sql
4个回答
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

希望这可以帮助


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

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)

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);
© www.soinside.com 2019 - 2024. All rights reserved.