【问题标题】:Two columns unique combine两列独特的组合
【发布时间】:2017-12-18 17:08:45
【问题描述】:

我有这样的桌子

message_id |发件人 ID |收件人 ID |信息 6 677 681 消息 0 7 677 678 消息 1 9 677 678 消息 2 10 677 681 消息 3 11 677 698 消息 4 12 678 677 消息 5

我想用一个参数将它们之间唯一的 sender_id 和 recipient_id 分组。例如,我想像这样选择与 user_id 677 表相关的行;

message_id |发件人 ID |收件人 ID |信息 10 677 681 消息 3 11 677 698 消息 4 12 678 677 消息 5

我已经为此工作了几个小时,但没有得到想要的结果。

【问题讨论】:

  • 为什么包含消息 3,因为它与消息 0 重复?
  • 因为用户(id 677)在不同时间向用户(id 681)发送消息

标签: mysql sql


【解决方案1】:

这是一个解决方案

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 sqlfiddle.com/#!9/9df65c/15的列表
  • @hllktlhndd - 没问题。感谢您解决一个具有挑战性的问题:)
【解决方案2】:

试一试...我不是 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

【讨论】:

    【解决方案3】:
    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()?
    【解决方案4】:

    你可以这样做:

    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()
    猜你喜欢
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多