有一个user表,表中有两个字段分别是username和city,表中有3条条记录。
username city
张三 北京
张三 上海
李四 北京
如果只是查询张三和李四各有多少人,可以通过下面语句查询
select username,city,count(*) from user group by username
问:怎样查询在不同城市叫张三和李四的人各有多少个呢?
我希望显示的结果是:
张三 共2人 北京1人 上海1人 ...
李四 共1人 北京1人 上海0人 ...
所以通过通过下面查询是不可行的。这会导致出现重复行,而且也不能统计张三有多少人。
select username,city,count(*) from user group by username,city
张三 1 张三 1 李四 1
我需要的结果是:
张三 2 1 1
李四 1 1 0
==============================================================
下面是我的PHP代码,如果单纯一次查询不能实现,那PHP应怎样写呢?
<?php
$db = new MySQLi(DB_HOST, DB_USER, DB_PASSWD, DB_NAME, DB_PORT);
$query = "
SELECT username, count( * )
FROM user
GROUP BY username
")
$result = $db->query($query);
$num_rows = $result->num_rows;
$num_cols = $result->num_fields;
echo '<table>';
for ($i=0;$i<$num_rows;$i++){
$rows = $result->fetch_assoc();
echo '<tr>';
foreach($rows as $cols){
echo '<td>'.$cols.'</td>';
}
echo '</tr>';
}
echo '</table>';
?>
先执行
搜出来的结果(简写):
[ 0 => [ username => name1, city => city1, count => 1 ], 1 => [ username => name1, city => city2, count => 2 ], ... ]假设结果保存在$rs变量里,使用php处理一下:
$user = []; foreach ($rs as $row) { $name = $row['username']; $city = $row['city']; isset($user[$name]['total']) { $user[$name]['total'] += $row['count']; } else { $user[$name]['total'] = $row['count']; } $user[$name]['detail'][$city] = $row['count']; }当然这是按我自己喜欢的结构存的,你也可以修改成你喜欢的结构。出来的结果如下(简写):
[ user1 => [ total => 3, detail => [ city1 => 1, city2 => 2, ... ], ... ]