2016-03-13 37 views
1

我想構建郵件系統,我想從表中選擇不同的值並按日期排序,並返回讀取和未讀狀態。我的表格結構是id, from_user_id, to_user_id, message, datetime, read。假設虛擬數據如下:選擇與表格不同,並按日期排序

id | from_user_id | to_user_id | message |  datetime  | read 
1 |   20  |  50  | hi  | 2016-3-13 06:05:30 | 1 
2 |   20  |  50  | hey  | 2016-3-13 06:15:30 | 0 
3 |   30  |  50  | hi  | 2016-3-14 06:05:30 | 0 

現在我要選擇不同的from_user_id和按日期排序,這樣我可以顯示用戶的誰是最近茶亭在列表頂部的名稱,並返回讀狀態1 ,如果有from_user_id的任何行已經讀取狀態0,那麼我想將read返回爲0,以便我可以區分哪些用戶消息具有未讀消息。

假設,from_user_id具有read狀態爲0在一行中,那麼我想返回read狀態爲0時返回不同的值from_user_id。我該怎麼做。我嘗試如下,但不會在我的情況下工作。它返回不同的值,但不按日期排序,也讀取狀態不返回我所期望的。

select distinct(`from_user_id`),register.name FROM message INNER JOIN register ON register.id = message.from_user_id where message.to_user_id = $user_id GROUP BY message.id ORDER BY MAX(datetime) ASC 

回答

2

嘗試以下查詢:

SELECT 
message.from_user_id, 
register.name, 
message.read 
FROM message 
INNER JOIN 
(
    SELECT 
    from_user_id, 
    MAX(datetime) max_datetime 
    FROM message 
    WHERE to_user_id = 50 
    GROUP BY from_user_id) t 
ON t.from_user_id = message.from_user_id AND t.max_datetime = message.datetime 
INNER JOIN register ON register.id = message.from_user_id 
WHERE message.to_user_id = 50 
ORDER BY message.datetime ASC 

UPDATED SQL FIDDLE

樣品輸入:

id | from_user_id | to_user_id | message |  datetime  | read 

1 |   20  |  50  | hi  | 2016-3-13 06:05:30 | 1 
2 |   20  |  50  | hey | 2016-3-13 06:15:30 | 0 
3 |   30  |  50  | hi  | 2016-3-14 06:05:30 | 0 

輸出:

from_user_id  name  read 

20     User20  0 
30     User30  0 

注:如果在具有相同datetime和同你message表中存在多個條目,該查詢可能會給你多行對同一from_user_idto_user_id

+1

哇。它按預期工作。謝謝。 – user254153

+0

請檢查更新後的sql小提琴。我也修改了查詢。請檢查此更新。 @ user254153 – 1000111

+0

你的意思是,如果'to_user_id'和'datetime'對於兩行是相同的,它可能會返回多個'from_user_id'。但是,如何解決。我只想選擇不同的。 – user254153

0

結帳這個查詢:

SELECT DISTINCT(form_user_id),MIN(讀)FROM表名ORDER BY日期時間ASC