2014-11-03 36 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;