我正在建立一个基本的短信网络网关,我的网站上的一个人将能够通过短信与多个电话用户聊天。
我的消息表设置如下:
id | message | smsFrom | smsTo |time
为简化起见,一些样本数据如下:
smsFrom | smsTo
4 | 5
3 | 5
5 | 4
3 | 5
5 | 3
7 | 5
9 | 5
8 | 5
其中5
代表聊天操作员,其他数字代表人们与他们谈论短信。
最好的方法是,通过SQL
或PHP
按操作员和号码分组我的数据,以便我可以在不同的标签中显示我的对话,或者我决定显示它们。
我的预期输出将是:
4 | 5
5 | 4
3 | 5
3 | 5
5 | 3
7 | 5
9 | 5
8 | 5
我想选择to
或from
字段与我的运营商编号匹配的所有行,然后将所有这些结果分组为不是我的运营商编号的数字来创建对话我然后可以随意格式化。
答案 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'];
}
}