2011-12-29 86 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;