对消息会话进行分组的SQL查询

对消息会话进行分组的SQL查询,sql,Sql,我正试图根据to_编号和from_编号以及创建日期/时间,在2个用户之间选择最近的记录 找到记录后,显示消息和时间戳。只要to_号码或from_号码具有相同的配对,那么这就是我要显示的消息 我真的很难找到以前没有列出的、具有相同数字组合的、独一无二的to/from或from/to记录 我的数据: Messages table: "id","to_number","from_number","message","created_at","dm_user_id" "1","7325551212","

我正试图根据to_编号和from_编号以及创建日期/时间,在2个用户之间选择最近的记录

找到记录后,显示消息和时间戳。只要to_号码或from_号码具有相同的配对,那么这就是我要显示的消息

我真的很难找到以前没有列出的、具有相同数字组合的、独一无二的to/from或from/to记录

我的数据:

Messages table:
"id","to_number","from_number","message","created_at","dm_user_id"
"1","7325551212","5705551234","new update","2011-12-17T11:26:33-05:00","1"
"2","5705551234","3015551212","next update","2011-12-17T11:26:53-05:00","1"
"3","6095559876","4695551212","trying messages.","2011-12-19T19:20:47-05:00","2"
"4","5705551234","4155551212","did i get this?","2011-12-19T20:04:40-05:00","1"
"5","9075551212","5705551234","Where did this go?","2011-12-19T20:05:51-05:00","1"
"6","9075551212","5705551234","testing","2011-12-19T20:12:53-05:00","1"
"7","3015551212","5705551234","Are you here ","2011-12-19T20:13:34-05:00","1"
"8","6175554567","4695551212","test from app","2011-12-19T22:51:32-05:00","2"
根据以上数据,我只想要以下记录,从最新到最旧列出

注意:并非所有记录都将返回,因为存在重复的to/from组合。例如,id 2和id 7是相同2个号码之间的消息。仅返回最近的id 7

另一个例子是id 5和id 6-它们都是从同一个号码发送的,因此只返回最近的一个,id 6:

对于dm_用户_id=1

"3015551212", "Hello",           "2011-12-19T20:13:34-05:00"  # id 7
"9075551212", "testing",         "2011-12-19T20:12:53-05:00"  # id 6
"4155551212", "did i get this?", "2011-12-19T20:04:40-05:00"  # id 4
"7325551212", "new update",      "2011-12-17T11:26:33-05:00"  # id 1
对于dm_用户_id=2

"6175554567", "test from app",    "2011-12-19T22:51:32-05:00"  # id 8
"6095559876", "trying messages.", "2011-12-19T19:20:47-05:00"  # id 3
我正在尝试分组和区分的不同组合,但没有得到我想要的结果

select * from messages where dm_user_id = 1
group by to_number, from_number

select * from (
select DISTINCT to_number, from_number dm_user_id
from messages) where dm_user_id = 1

对于
dm_users
表,您需要:

select
    m.*
from
    dm_users u1
    cross join dm_users u2
    inner join messages m on
        u1.phone_number in (m.to_number, m.from_number)
        and u2.phone_number in (m.to_number, m.from_number)
where
    u1.dm_user_id = 1
    and u2.dm_user_id = 2
order by
    m.created_at desc

这是一个常见的问题,基本上你想要每个号码的最新消息,无论是收件人还是发件人,但你不想要重复的消息。您可能会在这一类别中发现一些有用的东西

这是一种工作SQL,对于给定的to/from、from/to数字对,它只返回一条最新消息,并使用最新的first进行排序。修改了来自的SQL


您是否有一个用户表,其中包含
dm\u user\u id
phone\u number
作为关系,或者该关系仅存在于
messages
表中?@Eric我有另一个名为dm\u users的表。该表有
“id”、“email”、“hash\u password”、“salt”、“created\u at”、“permission\u level”、“username”、“phone\u number”
您有能力在该数据库内创建视图吗?@CapeCodGunny我不确定。我在heroku上使用postgres,但还没有完全了解提供的所有功能。当我运行select时,我只得到一条记录。这是最新的记录,但没有得到所有的记录。我在where子句中得到了一个未知列“u1.dm_user_id”的错误。我尝试了对sqlite和mysqlIs的查询。
dm_users
不是
dm_user_id
?如果没有,只需将
where
子句中的列名更改为列名即可。我可能已经给出了上述信息,从而混淆了问题。我有每个dm_用户的电话号码仅供参考。在这一点上,我只感兴趣的是获得一个列表,其中包含唯一的到/从编号组合,并且只有最新的。这很有效。从上面的链接调整,以适应我的数据和结果,只有一个组合对和排序最新的最旧的。
SELECT
   fullMessage.id,
   fullMessage.to_number,
   fullMessage.from_number,
   fullMessage.message,
   fullMessage.dm_user_id
FROM
    messages fullMessage JOIN
    (
        SELECT max(id) as MAX_ID, to_number, from_number
        FROM messages WHERE dm_user_id = 1  # this can be changed for any dm_user_id
        GROUP BY from_number, to_number
    ) maxMessage ON maxMessage.MAX_ID = fullMessage.id
ORDER BY fullMessage.id desc;