有用户。每个用户可以拥有多个属性。如果用户不属于他们自己的财产,则用户可以从财产页面开始与财产所有者进行对话。
我有以下表格:
用户(表格)
id integer
username varchar
....
财产(表)
id integer
user_id integer
....
消息(表格)
id integer
sender integer fk
receiver integer fk
property_id integer fk
message varchar
created_at timestamp
我已经提出了上面提到的message
表来存储对话。当用户登录时,他/她可以看到所有对话(仅来自每个对话的最后一条消息),并且可以进一步扩展以完全查看对话。
为了获得当前用户的所有会话,我必须从message
表中选择sender
或receiver
为当前用户的所有内容,并根据需要将其分组property_id
以property_id
分隔的对话。
例如,2个用户可以就每个属性进行2次单独的对话,实际上他们甚至不需要知道他们在每种情况下都与同一个人说话。重要的是谈话是关于财产的。
我已经提出了以下SQL(mysql)来获取当前用户的所有会话,但我不认为这是最佳方式,我认为这种方法不会规模好(从绩效的角度来看)。
SELECT *
FROM `message`
WHERE `id` IN
(SELECT MAX(`id`)
FROM `message`
WHERE (`sender` = @current_user OR `receiver` = @current_user)
GROUP BY CONCAT((`sender`+`receiver`), `property_id`))
有什么建议可以做得更好吗?
P.S。没有在方程中添加另一个表,并且建议可以基于property_id
总是属于一个不同用户的事实(尽管我无法想出使用它的方式)。
修改1
这里MAX(id)
可靠吗?无论如何要按created_at
订购以获取每个对话的最新消息?
修改2 :根据sender
,receiver
和property_id
sender
或receiver
,确定对话是唯一的成为当前用户。