2011-12-29 89 views
3

我想根据to_number和from_number并创建日期/时间来选择2个用户之间的最近记录。SQL查询分组消息对话

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

我真的很难找到从/到或从具有相同数字组合和以前没有列出的记录中找到唯一的OR。

我的数据:

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" 

从上面的数据,我只想以下记录,列出最新到最旧。

注:并非所有记录都将被返回,因为存在组合的重复。例如,id 2和id 7是相同2个数字之间的消息。只有最近将被退回,ID 7

另一个例子是ID 5和ID 6 - 他们都是向/从同一个号码,只有最近返回,ID 6:

为dm_user_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_user_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 

我想GROUP BY和DISTINCT的不同组合,但没有得到我在寻找的结果。

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 
+0

你有一个用户表有'dm_user_id'和'phone_number'作为关系,或者这个关系只存在于'messages'表中吗? – Eric 2011-12-30 16:56:40

+0

@Eric我有另一个表dm_users。该表具有''id“,”email“,”hashed_pa​​ssword“,”salt“,”created_at“,”permission_level“,”username“,”phone_number“ – chaddow 2011-12-30 17:13:22

+0

您是否有能力在此数据库中创建视图? – 2011-12-30 22:18:48

回答

0

这是一个常见的问题,基本上你想从每个号码的最新消息,无论是或,但你不知道想要重复。您可能会发现此类别中有用的东西greatest-n-per-group

+0

这工作。从上面的链接进行调整,以适合我的数据,并在只有一个组合对结果,并从最新到最旧排序。 – chaddow 2011-12-30 23:37:18

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 
+0

当我运行选择,我回来只有1条记录。这是最近的记录,但没有获得所有的记录。 – chaddow 2011-12-30 17:20:14

+0

为您更新了查询 – Eric 2011-12-30 17:25:04

+0

我在'where子句'中收到'未知列'u1.dm_user_id'的错误我在sqlite和mysql上试过查询 – chaddow 2011-12-30 19:57:40

0

正在工作的SQL,仅返回1个给定来往/去往/来自数字对的最近消息,并与最近的第一条消息进行排序。从this link修改了SQL。

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;