【问题标题】:How do I use an AND statement with SELECT DISTINCT?如何在 SELECT DISTINCT 中使用 AND 语句?
【发布时间】:2014-05-25 19:08:04
【问题描述】:

我想根据两列选择不同的,这样如果两列中的任何一列具有相同的值,那么它只会发布该行一次。如果它可以帮助您理解,我正在做一个发送者/接收者的事情,我只想拉一行(无论是发送者还是接收者)。

这是我希望 MySQL 工作的方式:

SELECT DISTINCT(sender AND receiver), message, timestamp  
FROM messages 
WHERE receiver=receiver_name OR sender=sender_name;

例子:

消息表:

id|  sender |receiver | message                | timestamp
1 | Jeffrey | Michael | Hey man, what's up     | 12:00 PM  
2 | Michael | Jeffrey | Not much. How are you? | 12:02 PM

SQL查询后的结果:

Michael 的最新消息:不多。你好吗?时间:12:02 PM

我希望这是有道理的

【问题讨论】:

  • 你想要的结果是什么?

标签: mysql sql


【解决方案1】:

从 OP 评论到 Gordon Linoff 的回答,他似乎有兴趣检索他和其他人之间每次转换的最后一条消息,在这种情况下,发送者或接收者将是他

SET @myname = 'Michael' --just stick here your name

SELECT m.*
FROM   messages m
       INNER JOIN (SELECT MAX(ID) ID
                   FROM   messages
                   WHERE  @myname IN (receiver, sender)
                   GROUP BY COALESCE(NULLIF(receiver, @myname), sender)
                  ) a ON m.ID = a.ID

公式COALESCE(NULLIF(receiver, @myname), sender) 将始终以其他名称解析:

  • 如果 OP 是发送者,那么NULLIF(receiver, @myname) 将返回接收者,COALESCE 也将返回
  • 如果 OP 是接收者,则 NULLIF(receiver, @myname) 将返回 NULLCOALESCE 将返回发送者

【讨论】:

    【解决方案2】:

    你的代码 -

    SELECT DISTINCT(sender AND receiver), message, timestamp 
    FROM messages 
    WHERE receiver=receiver_name OR sender=sender_name;
    

    这里有新代码 -

    SELECT DISTINCT (sender , receiver), message, timestamp  
    FROM messages 
    WHERE .........
    

    【讨论】:

    • 什么都不返回。我需要隔离不同的人,否则如果您发送或收到来自同一个人的消息,则不会返回任何内容
    【解决方案3】:

    你需要使用concat函数。

    SELECT distinct concat(sender,receiver)
    FROM messages
    WHERE receiver=receiver_name OR sender=sender_name;
    

    请参阅here 了解更多信息。

    【讨论】:

    • 这也会返回消息和时间戳值吗?
    • 查询为您提供不同的值,如果这些值重复但具有不同的日期时间值,您需要根据 MA​​X(timestamp) 值获取最后一条记录。
    【解决方案4】:

    我想你想使用least()greatest()

    select distinct least(sender, receiver), greatest(sender, receiver)
    from messages;
    

    如果您想要最近的时间戳,请使用group by

    select least(sender, receiver), greatest(sender, receiver),
           max(timestamp)
    from messages
    group by least(sender, receiver), greatest(sender, receiver);
    

    编辑:

    如果您想了解有关某人发送或接收的最后一条消息的信息,您可以这样做:

    select m.*
    from messages m
    where not exists (select 1
                      from messages m2
                      where (m2.sender = m.sender or m2.receiver = m.receiver or
                             m2.receiver = m.receiver or m2.receiver = m.sender
                            ) and
                            m2.timestamp > m.timestamp
                     );
    

    【讨论】:

    • 它只显示每条消息。我只想为每个人显示一条消息(他们发送的最后一条消息)。
    • 这几乎可以工作,但它只显示来自一位用户的一条消息。我想显示给我发消息的每个用户的一条消息。
    猜你喜欢
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多