Php 如何对mysql查询中的数据进行分组
我正在建立一个基本的SMS-to-web网关,我的网站上的一个人可以通过SMS与多个电话用户聊天 我的邮件表设置如下: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表示聊天室操作员,
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