Mysql 用于两列的SQL distinct
所以我有一个如下所示的SQL表。这张表是一组人与人之间的短信。我想得到所有存在的线程。这基本上意味着两个人之间的最后一条信息。我该怎么做Mysql 用于两列的SQL distinct,mysql,sql,Mysql,Sql,所以我有一个如下所示的SQL表。这张表是一组人与人之间的短信。我想得到所有存在的线程。这基本上意味着两个人之间的最后一条信息。我该怎么做 ------------------------------------------------------- | sender_id | receiver_id | message | time | ------------------------------------------------------- | 123
-------------------------------------------------------
| 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为了得到正确的最新日期,我想你需要。我可能错了,但是没有内联视图的答案不会产生正确的输出。我想您确实需要一个内联视图;)接得好