php - Mysql - 选择并分组具有 A 列和 B 列的行,其中 A.value 和 B.value = x 和 y 或 y 和 x

标签 php mysql sql

我有一个表,其中有 2 个数字 (int) 值 (ID),分别为 sender_idreceiver_id

我想做的是将这些行分组为“对话”。之间的对话:

sender_id = 1, and receiver_id = 5,

sender_id = 5receiver_id = 1

的对话相同

因此,当我获取数据库行时,我希望每个对话只包含 1 行。

我将为特定用户获取这些对话。用户 ID(我已经知道,将其称为 userId)可以位于 sender_idreceiver_id 中。

所以我的算法会是这样的:

Select All rows 
from Database, 
where sender_id = userId OR receiver_id = userId, 
group by sender_id+user_id

结果行必须包含另一列值(不是等于 userId 的值),但它可以同时包含两者,我必须通过将它们与 userId 进行比较来检测另一列我有。

说实话,我一直对 SQL 手册感到不舒服。由于某种原因,我无法从那里找到我需要的东西。原谅我..

我不确定是否应该创建临时表或使用 SQL SUM 函数,或者是否可以使用类似 GROUP BY sender_id+receiver_id

更多信息(不确定是否相关): 我正在使用 PHP 该表还有一些列,例如 record_id、create_date 和 read_date

非常感谢您的帮助和回复。

更新: 我的问题的解决方案标记如下。但是,我遇到了另一个问题,我想分享一下,因为它可能有助于稍后查看此问题的人。

我面临的问题是,当我显示对话时,我想显示最后一条消息行。现在,当分组完成后,分组将堆叠在找到的第一行上。我想要相反的。我希望返回的行包含每个对话的最后一条消息行。

我可以通过以下查询来做到这一点。请注意,这只是一种方法,我还不确定该查询的性能。我稍后会对其进行测试,并根据需要进行更新。

$this->id 是我想要显示其对话的用户的 ID。

"SELECT t1.* FROM table t1 
        INNER JOIN (
            SELECT sender_id, receiver_id, max(create_date) lastCreateDate 
            FROM table 
            WHERE receiver_id = ".$this->id." OR sender_Id = ".$this->id." 
            GROUP BY GREATEST(sender_id ,receiver_id), LEAST(sender_id,receiver_id)
        ) t2
        ON ((t1.sender_id = t2.sender_id 
        OR t1.sender_id = t2.receiver_id) 
        AND t1.create_date = t2.lastCreateDate) 
        ORDER BY create_date DESC LIMIT 0,15"

最佳答案

LEAST 返回最小值,GREATEST 返回最大值:

GROUP BY LEAST(sender_id, receiver_id), GREATEST(sender_id, receiver_id)

关于php - Mysql - 选择并分组具有 A 列和 B 列的行,其中 A.value 和 B.value = x 和 y 或 y 和 x,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30289568/

相关文章:

java - 处理 '\&' 从 java 到 SP(除了设置定义/扫描关闭)

php - 数据库插入时的 SQL 查询错误

php - 如何从 Laravel 4 中的替代目录加载 View

PHP basename() 删除变量,奇怪的效果

mysql - 粉碎 MySQL 行

php - 如何在MySQL插入查询中自动插入特定日期和特定时间

mysql - 加入/排序运行缓慢

php - 时间戳困惑 : solution for concurrency issue

php - 包含非 ASCII 字符的字符串会被 PHP/MySQL 截断

php - 在 Phalcon 2 中找不到类用户