2014-02-20 111 views
0

嗨我想寫一個正確的查詢MySQL從4列(從,到,內容,日期或所有,如果這更容易)檢索值2列在同一個表中是唯一的。這樣做是爲了獲取用戶X發送和接收的只有最後的消息列表我的SQL查詢基於來自兩列的唯一記錄檢索4列

msg_id|msg_from|msg_to|msg_new|msg_content|date 
1  user1  sw1  1  message1 2014-02-06 
2  user1  sw1  1  message2 2014-02-06 
3  user1  sw3  0  message3 2014-02-06 
4  user1  sw5  0  message4 2014-02-06 
5  sw2  sm2  1  message5 0000-00-00 
6  sw2  sm4  1  message6 2014-02-20 
7  sw1  user1 1  message7 2014-02-20 
8  user1  sw5  1  message8 2014-02-20 

我最後一次嘗試:

SELECT t1.* FROM (SELECT MAX(msg_id) AS nr, msg_from, msg_to 
    FROM com_msg GROUP BY msg_from) AS t2 
    INNER JOIN com_msg t1 ON t1.msg_from=t2.msg_from AND t1.msg_id=t2.nr 
    WHERE t1.msg_to='sw1' OR t1.msg_from='sw1' 

返回:

2| user1|sw1 |1|message2|2014-02-06 
7| sw1 |user1|1|message7|2014-02-20 

但應該只返回:

7| sw1 |user1|1|message7|2014-02-20 
+0

我很困惑...你原來的職位說,「想法是檢索僅由用戶X發送和接收的最後消息的列表「,但是您的示例僅顯示1條消息。你想要一條消息還是2條消息? – Scottie

+0

我認爲你正在尋找每次對話的最後一條消息?在這種情況下,它只是一個,但可能會有更多? – fthiella

回答

1

如果我正確understant你的問題,這個查詢應該返回你所需要的:

SELECT com_msg.* 
FROM com_msg INNER JOIN (SELECT MAX(msg_id) max_id 
         FROM com_msg 
         WHERE 'sw1' IN (msg_from, msg_to) 
         GROUP BY 
          CASE WHEN msg_from!='sw1' THEN msg_from 
           ELSE msg_to END) m 
    ON com_msg.msg_id = m.max_id 

標識需要訂購,否則你應該使用MAX(日)

請參閱小提琴here

+0

完美,訣竅100%謝謝 – bart

0

基本上,你需要用另一個查詢來包裝它,因爲你的where子句向你顯示記錄的位置,或者來自等於用戶的位置。我不是一個MySQL的大師,但你應該能夠做這樣的事情:

select top 1 * 
FROM (
    SELECT t1.* FROM (
     SELECT MAX(msg_id) AS nr, msg_from, msg_to 
     FROM com_msg 
     GROUP BY msg_from 
    ) AS t2 
    INNER JOIN com_msg t1 ON t1.msg_from=t2.msg_from AND t1.msg_id=t2.nr 
    WHERE t1.msg_to='sw1' OR t1.msg_from='sw1' 
) 
ORDER BY date DESC 

這將返回從結果基於日期最新的條目。

0

如果你正在尋找只是一個單一的記錄返回喜歡你的例子所示,這應該這樣做的最後一封電子郵件中......

Select TOP 1 msg_from, msg_to, msg_content, date 
From com_msg 
Where msg_from='sw1' OR msg_to='sw1' 
ORDER BY msg_id DESC 
+0

感謝您的輸入,對於混淆感到抱歉它實際上只是最後一個msg,不管它是由用戶X發送還是接收,以前嘗試過TOP 1查詢但每次都會收到MYSQL錯誤 – bart