我如何从我的mysql查询中分组数据

时间:2014-05-27 20:39:44

标签: php mysql mysqli

我正在建立一个基本的短信网络网关,我的网站上的一个人将能够通过短信与多个电话用户聊天。

我的消息表设置如下:

id | message | smsFrom | smsTo |time

为简化起见,一些样本数据如下:

smsFrom | smsTo

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

其中5代表聊天操作员,其他数字代表人们与他们谈论短信。

最好的方法是,通过SQLPHP按操作员和号码分组我的数据,以便我可以在不同的标签中显示我的对话,或者我决定显示它们。

我的预期输出将是:

4 | 5
5 | 4

3 | 5
3 | 5
5 | 3

7 | 5

9 | 5

8 | 5

我想选择tofrom字段与我的运营商编号匹配的所有行,然后将所有这些结果分组为不是我的运营商编号的数字来创建对话我然后可以随意格式化。

4 个答案:

答案 0 :(得分:1)

使用您的示例数据并对所需的输出进行采样,看起来并不像您希望将数据分组到想要组织它一样多。

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

订购

SELECT IF(smsFrom = 5, smsTo, smsFrom) AS `targetId` FROM sms
WHERE 5 IN (smsFrom, smsTo)
ORDER BY targetId ASC;

分组

SELECT IF(smsFrom = 5, smsTo, smsFrom) AS `targetId`, COUNT(*) FROM sms
WHERE 5 IN (smsFrom, smsTo)
GROUP BY targetId;

编辑:根据需要选择所需的字段。 COUNT(*)仅用于演示分组

答案 1 :(得分:0)

SELECT smsFrom + smsTo - 5 as partner
    FROM `table`
    WHERE smsFrom = 5 or smsTo = 5
    GROUP BY partner

答案 2 :(得分:0)

这样的事情应该有效。

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,这对每对smsFrom / smsTo都是唯一的。

答案 3 :(得分:-1)

不知道桌子会有多大,所以还没有关于优化的消息。但这可能适用于小数据库大小:

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'];
    }
}