合并行然后对它们进行分组?

时间:2015-06-09 07:02:41

标签: php mysql

我最近开始在像聊天信使这样的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。有谁知道如何使这项工作?

1 个答案:

答案 0 :(得分:1)

尽管存在性能问题:

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;