Mysql 用于两列的SQL distinct

Mysql 用于两列的SQL distinct,mysql,sql,Mysql,Sql,所以我有一个如下所示的SQL表。这张表是一组人与人之间的短信。我想得到所有存在的线程。这基本上意味着两个人之间的最后一条信息。我该怎么做 ------------------------------------------------------- | sender_id | receiver_id | message | time | ------------------------------------------------------- | 123

所以我有一个如下所示的SQL表。这张表是一组人与人之间的短信。我想得到所有存在的线程。这基本上意味着两个人之间的最后一条信息。我该怎么做

-------------------------------------------------------
| sender_id  |  receiver_id  | message   | time         |
-------------------------------------------------------
| 123        |  456          | hi        | 4/17/2013    | 
--------------------------------------------------------
| 123        |  111          | hi        | 4/18/2013    | 
--------------------------------------------------------
| 123        |  555          | hi        | 4/19/2013    | 
-------------------------------------------------------- 
| 555        |  123          | hi        | 4/20/2013    | 
--------------------------------------------------------
| 444        |  333          | hi        | 4/21/2013    | 
--------------------------------------------------------
| 123        |  555          | hi        | 4/22/2013    | 
--------------------------------------------------------
| 777        |  123          | hi        | 4/23/2013    | 
--------------------------------------------------------
我希望获得user=123的响应行,如下所示。请注意发送者id和接收者id作为一个整体是如何唯一的。这意味着joe发送给bob的消息与bob发送给joe的消息在同一线程中

-------------------------------------------------------
| sender_id  |  receiver_id  | message   | time         |
-------------------------------------------------------
| 123        |  456          | hi        | 4/17/2013    | 
--------------------------------------------------------
| 123        |  111          | hi        | 4/18/2013    | 
--------------------------------------------------------
| 123        |  555          | hi        | 4/22/2013    | 
--------------------------------------------------------
| 777        |  123          | hi        | 4/23/2013    | 
--------------------------------------------------------

这应该适合您:

SELECT sender_id, receiver_id, message, time FROM your_table GROUP BY sender_id, receiver_id ORDER BY time DESC;

这应该适合您:

SELECT sender_id, receiver_id, message, time FROM your_table GROUP BY sender_id, receiver_id ORDER BY time DESC;
这应该做到:

SELECT * FROM (
  SELECT sender_id, receiver_id, 
    IF(sender_id > receiver_id, CONCAT(sender_id, '_', receiver_id), 
   CONCAT(receiver_id, '_', sender_id)
    ) AS conversation_key, 
    message, `time` 
FROM sms_messages WHERE sender_id = 123
UNION ALL
SELECT sender_id, receiver_id, 
    IF(
      sender_id > receiver_id, 
      CONCAT(sender_id, '_', receiver_id), 
  CONCAT(receiver_id, '_', sender_id)
    ) AS conversation_key, message, `time` 
FROM sms_messages WHERE receiver_id = 123
) t 
GROUP BY conversation_key ORDER BY NULL
这应该做到:

SELECT * FROM (
  SELECT sender_id, receiver_id, 
    IF(sender_id > receiver_id, CONCAT(sender_id, '_', receiver_id), 
   CONCAT(receiver_id, '_', sender_id)
    ) AS conversation_key, 
    message, `time` 
FROM sms_messages WHERE sender_id = 123
UNION ALL
SELECT sender_id, receiver_id, 
    IF(
      sender_id > receiver_id, 
      CONCAT(sender_id, '_', receiver_id), 
  CONCAT(receiver_id, '_', sender_id)
    ) AS conversation_key, message, `time` 
FROM sms_messages WHERE receiver_id = 123
) t 
GROUP BY conversation_key ORDER BY NULL

更易于阅读的版本,正确处理日期排序(如问题所示)并利用索引:

SELECT sender_id, receiver_id, message, time FROM
(
SELECT sender_id, receiver_id, message, time
FROM myTable 
WHERE sender_id = 123 OR receiver_id = 123
ORDER BY time DESC
) a
GROUP BY (CASE WHEN sender_id = 123 THEN receiver_id
   ELSE sender_id END);

.

一个更易于阅读的版本,正确处理日期排序(如问题所示)并利用索引:

SELECT sender_id, receiver_id, message, time FROM
(
SELECT sender_id, receiver_id, message, time
FROM myTable 
WHERE sender_id = 123 OR receiver_id = 123
ORDER BY time DESC
) a
GROUP BY (CASE WHEN sender_id = 123 THEN receiver_id
   ELSE sender_id END);

.

没有实际测试它,但是下面的查询应该为每个不同的
发送者id
/
接收者id
组合返回最新的消息(在两个“方向”):

简单英语:选择每条消息,使其在同一发送者/接收者或接收者/发送者的所有消息中具有最长时间

如果需要,您可以通过修改外部WHERE子句轻松地将其限制到给定用户,例如:

--- || ---
AND (sender_id = 123 OR receiver_id = 123)


1请注意,如果时间不唯一,则可能会有多条“最新”消息。

尚未实际测试它,但以下查询应为每个不同的
发送方id
/
接收方id
组合返回最新消息(在两个“方向”):

简单英语:选择每条消息,使其在同一发送者/接收者或接收者/发送者的所有消息中具有最长时间

如果需要,您可以通过修改外部WHERE子句轻松地将其限制到给定用户,例如:

--- || ---
AND (sender_id = 123 OR receiver_id = 123)


1请注意,如果
时间
不是唯一的,则可能会有多条“最新”消息。

用户123只是一个示例,我认为这里需要更一般的查询。 此解决方案避免了耗时的连接,仅假设最多有10000个用户(易于扩展)

选择发送者id、接收者id、消息、最大(时间),

如果(sender_id用户123只是一个例子,我认为这里需要更一般的查询。 此解决方案避免了耗时的连接,仅假设最多有10000个用户(易于扩展)

选择发送者id、接收者id、消息、最大(时间),

IF(sender_id哪个数据库引擎?非常依赖于该引擎。@codennija下次,将其放在您的标记中-您将更快获得帮助。我已为您添加了
mysql
标记。以后,请在问题本身的正文或标记中添加附加信息(以适当的为准)。它使您更容易看到,并有助于将问题传达给能够帮助您更快获得答案的人。:-)哪个数据库引擎?非常依赖于引擎。@codeNinja下次,把它放在你的标记中-你会更快地得到帮助。我已经为你添加了
mysql
标记。以后,请在问题本身的正文或标记中添加附加信息(以适当的为准).它让人更容易看到,而且有助于将问题传达给那些能帮助你更快得到答案的人。:-)不完全是。从A到B和从B到A的消息是同一个线程。不完全一样。从A到B和从B到A的消息是同一个线程。@ConradFrix要获得正确的最新日期,我想你需要。我可能错了,但是没有内联视图的答案不会产生正确的输出。我想您确实需要一个内联视图;)美好的catch@ConradFrix为了得到正确的最新日期,我想你需要。我可能错了,但是没有内联视图的答案不会产生正确的输出。我想您确实需要一个内联视图;)接得好