Php 如何对mysql查询中的数据进行分组

Php 如何对mysql查询中的数据进行分组,php,mysql,mysqli,Php,Mysql,Mysqli,我正在建立一个基本的SMS-to-web网关,我的网站上的一个人可以通过SMS与多个电话用户聊天 我的邮件表设置如下: id | message | smsFrom | smsTo | time 为了简化,一些示例数据如下所示: smsFrom | smsTo 4 | 5 3 | 5 5 | 4 3 | 5 5 | 3 7 | 5 9 | 5 8 | 5 4 | 5 5 | 4 3 | 5 3 | 5 5 | 3 7 | 5 9 | 5 8 | 5 其中5表示聊天室操作员,

我正在建立一个基本的SMS-to-web网关,我的网站上的一个人可以通过SMS与多个电话用户聊天

我的邮件表设置如下:

id | message | smsFrom | smsTo | time

为了简化,一些示例数据如下所示:

smsFrom | smsTo

4 | 5
3 | 5
5 | 4
3 | 5
5 | 3
7 | 5
9 | 5    
8 | 5
4 | 5
5 | 4

3 | 5
3 | 5
5 | 3

7 | 5

9 | 5

8 | 5
其中
5
表示聊天室操作员,其他数字表示与他们聊天的人

通过
SQL
PHP
将我的数据按运算符和数字分组,这样我就可以在不同的选项卡中显示我的对话,或者以我决定的方式显示对话,最好的方法是什么

我的预期输出如下:

smsFrom | smsTo

4 | 5
3 | 5
5 | 4
3 | 5
5 | 3
7 | 5
9 | 5    
8 | 5
4 | 5
5 | 4

3 | 5
3 | 5
5 | 3

7 | 5

9 | 5

8 | 5

我想选择
to
from
字段与我的操作员编号匹配的所有行,然后根据不是我的操作员编号的编号对所有这些结果进行分组,以创建对话,然后我可以按照我的要求进行格式化。

不知道表有多大,所以还没有关于优化的文字。但这可能适用于较小的DB大小:

SQL="SELECT * FROM table;"
// Do what ever you need to get the result as an array "$result"

// First create a sorting array, so grouping would be easy.
$sort=array();
$new=array();
foreach ($result as $r){
    if ($r["smsFrom"] > $r["smsTo"]){
        $sort[$r["smsFrom"]][$r["smsTo"]][]=$r["id"];
    }else{
        $sort[$r["smsTo"]][$r["smsFrom"]][]=$r["id"];
    }
    $new[$r["id"]]=array($r['smsFrom'], $r['smsTo']);
}

// Then based on the grouping, take the id and retrieve the original value.
foreach($sort as $a=>$c){
    foreach($c as $b=>$id){
        echo $new[$id]['smsFrom']." | ".$new[$id]['smsTo'];
    }
}

使用示例数据和示例所需的输出,看起来您不需要像组织数据那样对数据进行必要的分组

但是,无论哪种方式,您都可以执行以下操作:

订购 分组
编辑:根据需要选择所需字段<代码>计数(*)仅用于演示分组

类似的功能应该可以使用

SELECT
     smsFrom
    ,smsTo
    ,CONCAT(LEAST(smsFrom),'-',GREATEST(smsTo)) AS `col`
FROM my_table
WHERE smsFrom=5 OR smsTo=5
GROUP BY col
ORDER BY col

想法是创建新的列
col
,它对于来自
/
smsTo

的每一对
smsFrom都是唯一的“如何对mysql查询中的数据进行分组”你会使用聚合函数吗?@Fred ii-我会研究一下的,谢谢。@Dagon-是的,我最初的选择会在
smsFrom
smsTo
@中查找匹配项。Dagon阅读问题通常有助于找出问题所在。他在寻找对话的机会grouping@Dagon-我希望通过接收消息的操作员(who的号码是静态的)和使用该号码发送消息的多人中的每一人来中断/分组我的消息列表。
SELECT
     smsFrom
    ,smsTo
    ,CONCAT(LEAST(smsFrom),'-',GREATEST(smsTo)) AS `col`
FROM my_table
WHERE smsFrom=5 OR smsTo=5
GROUP BY col
ORDER BY col