我最近开始开发类似聊天信使的 facebook。我正在尝试将其组织到可以向每个用户显示他们最近的联系人的位置。为此,我需要以某种方式设置我的表。以下是我现在的查询方式:
$query = "SELECT uid1, uid2, message, timestamp FROM messages WHERE (uid1 = '$user[id]' OR uid2 = '$user[id]') ORDER by timestamp DESC LIMIT 10";
这是我的聊天客户端的设置方式。假设我们有 UserB 和 UserC。如果UserB给UserC发消息,UserB就是uid1,UserC就是uid2。如果UserC给UserB发消息,UserC就是uid1,UserB就是uid2。
这样一来,uid1 就是发送消息的人,uid2 就是接收消息的人。但是,在我的情况下,我正在尝试显示最近联系的用户。通过这样做,我需要获取最近联系的用户。我需要获取用户用户名所在的 UID1 和 UID2 结果,并且最重要的是我需要将其保存到不显示用户重复行的位置。这样,当显示最近的联系人时,它不会向我显示同一个用户 5 次,因为我们有 5 条消息来回传递。这样它只会显示一次,并且还会显示我最近联系过的其他用户(限制为 10)。
我开始寻找一种方法来做到这一点,但它似乎非常困难。我需要使用“GROUP BY”或“DISTINCT”键来确保结果不会显示重复的行。然而,这相当困难,因为 UID1 和 UID2 可以交换。所以我想,也许我可以按 UID1 和 UID2 分组。这是我的查询:
$query = "SELECT uid1, uid2, message, timestamp FROM messages WHERE (uid1 = '$user[id]' OR uid2 = '$user[id]') GROUP BY uid1, uid2 ORDER by timestamp DESC LIMIT 10";
我不确定为什么,但这并没有向我显示最近联系过的人。所以我突然想到,也许我需要以某种方式组合 UID1 和 UID2 结果,然后添加 DISTINCT 或 GROUP BY。有谁知道如何进行这项工作?
最佳答案
尽管存在性能问题:
SELECT DISTINCT IF(uid1<uid2,uid1,uid2) as uidA, IF(uid1>uid2,uid1,uid2) as uidB
FROM messages
WHERE (uid1 = ? OR uid2 = ?)
ORDER BY timestamp DESC LIMIT 10;
关于php - 合并行然后将它们分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30725077/