我有一个带有这样的表的消息系统
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上一样)。
答案 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
)