两列唯一组合

3
我有这样一个表格:
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分别归类为唯一的组,并只使用一个参数。例如,我想选择与用户ID 677 相关的行,表格如下:
message_id | sender_id | recipient_id | message
10           677         681            message 3
11           677         698            message 4
12           678         677            message 5
我已经花费了数小时来处理它,但是没有得到期望的结果。

你为什么要包含信息3,它是信息0的重复? - Ramesh
因为用户(ID为677)在不同的时间向用户(ID为681)发送了消息。 - hllktlhndd
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 Fiddle演示在此处 - http://sqlfiddle.com/#!9/9df65c/11 希望这可以帮到您。

谢谢您的回答,我已添加userid参数,因此可以获取特定user_id的列表http://sqlfiddle.com/#!9/9df65c/15 - hllktlhndd
@hllktlhndd - 没问题。感谢提供一个具有挑战性的问题来解决 :) - Ramesh

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
你可以像这样做:
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);

@hllktlhndd . . . 哎呀!我忘记写 max() 了。 - Gordon Linoff

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)

我认为MySQL没有row_number()函数? - Ramesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接