仅选择一次唯一组合

时间:2014-05-22 17:33:47

标签: php sql select unique message

我有一个带有这样的表的消息系统

ID   AID   FID   MESSAGE
1    1     2     Hi
2    2     1     Hi, how are you?
3    3     1     Hello One, what's up?
4    1     2     I'm fine, how about you?

ID是唯一的Message-ID,AID是发送器的ID,FID是消息的接收者的ID。消息就是消息本身。

我想选择ID最高的所有唯一组合只一次,因此输出如下所示:

ID   AID   FID   MESSAGE
3    3     1     Hello One, what's up?
4    1     2     I'm fine, how about you?

问题在于我无法正确选择AID = 2且FID = 1与FID = 1和AID = 2一样唯一,但它实际上是同一个对话。

任何建议都将非常感谢!

编辑:当前登录用户的ID是$ _SESSION [“说”]

编辑2:消息系统应该看起来像这样,显示对话中发送的最后一条消息(就像在facebook上一样)。

http://i.stack.imgur.com/Jmvfr.jpg

2 个答案:

答案 0 :(得分:2)

这里是查询:

select * from table
where ID in (
    select max(id) as maxid
    from table
    group by LEAST(aid, fid), GREATEST(aid, fid)
)

如果您只想从/到$ _SESSION [“说”]选择最后一条消息,您可以使用:

$query = "select * from table
where ID in (
    select max(id) as maxid
    from table
    where aid = ".$_SESSION["said"]." or fid = ".$_SESSION["said"]."
    group by LEAST(aid, fid), GREATEST(aid, fid)
)";

它会显示发送给该用户的所有最新消息的列表

答案 1 :(得分:1)

可能必须根据您的RDBMS(MySQL与Microsoft SQL Server等)进行修改,但以下代码应该让您朝着正确的方向前进......您可能需要修改字符串串联使用某种类型的演员或东西,但是,就像我说的,它依赖于RDBMS。

伪代码:

select *
from have
where id in
(
    select max(id) as topid
    from have
    group by case when aid<fid then aid+'|'+fid else fid+'|'+aid end
)