首页 > 开发 > php > 正文

MySQL 怎样分组查询

2017-09-06 15:07:07  来源:网友分享

有一个user表,表中有两个字段分别是username和city,表中有3条条记录。

username city
张三 北京
张三 上海
李四 北京

如果只是查询张三和李四各有多少人,可以通过下面语句查询

select username,city,count(*)from usergroup by username

问:怎样查询在不同城市叫张三和李四的人各有多少个呢?

我希望显示的结果是:
张三 共2人 北京1人 上海1人 ...
李四 共1人 北京1人 上海0人 ...

所以通过通过下面查询是不可行的。这会导致出现重复行,而且也不能统计张三有多少人。

select username,city,count(*)from usergroup 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 userGROUP 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>';		?>

解决方案

先执行

select username, city, count(*) from user group by city, username;

搜出来的结果(简写):

[  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,      ...  ],  ...]