2014-11-03 59 views
1

我正在嘗試編寫一個只從我的聊天系統中提取唯一消息的mysql語句。 有一個to_id和一個from_id。我想從每個對話中拉一行。Mysql語句從兩列中選擇不同的行

問題是如果存在與 to_id = 1 from_id = 2 一排並用 另一行to_id = 2 from_id = 1 我想要這兩個行被視爲是相同的。

我想到的陳述是「SELECT * FROM chat_messages GROUP BY to_id,from_id」。除了我上面提到的情況之外,這是有效的。

我做的另一個嘗試是使用「SELECT DISTINCT最少(to_id,from_id)作爲value1,最大(to_id,from_id)作爲來自chat_messages的值2」。

這將返回我需要什麼,但我不知道如何從類似消息的行,時間戳等,只給我弄的其餘信息值1 &值2這是to_id & from_id。

回答

2

只需使用表達式在第二個查詢第一個查詢的GROUP BY:

SELECT * FROM chat_messages GROUP BY LEAST(to_id,from_id), GREATEST(to_id,from_id) 
+0

@ hunijkah:我的回答可能需要一張紙條。示例查詢依賴於GROUP BY行爲的特定於MySQL的擴展。如果啓用了'ONLY_FULL_GROUP_BY' SQL模式,該語句將在MySQL中返回一個錯誤。對這種形式的查詢會在MySQL以外的RDBMS(例如SQL Server,Oracle,Teradata,DB2等)中返回一個錯誤。 – spencer7593 2014-11-04 03:06:52

+1

這很好,但是如何命令它返回最近的行。我已經嘗試過使用id desc命令,但它總是返回最低的編號 – 2015-03-04 13:05:23

+0

我想知道同樣的情況,如何排序最新的編號? – Arda 2015-10-08 17:01:16

0

如果第二個查詢返回你所期望的,那麼下面的查詢返回其餘信息:

SELECT * 
FROM chat_messages t1 INNER JOIN (
    SELECT DISTINCT LEAST(to_id, from_id) AS value1, 
     GREATEST(to_id, from_id) AS value2 
    FROM chat_messages 
) t2 ON t1.to_id = value1 AND t1.from_id = value2;