Rumah  >  Soal Jawab  >  teks badan

php - MySQL 怎样分组查询

有一个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>';		

?>
伊谢尔伦伊谢尔伦2749 hari yang lalu696

membalas semua(4)saya akan balas

  • PHPz

    PHPz2017-04-10 13:14:13

    先执行

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

    balas
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 13:14:13

    select
    username,
    count(*),
    (select count(*) from user where username = a.username and city = '北京'),
    (select count(*) from user where username = a.username and city = '上海')
    from user a
    group by username

    如果城市很多的话,先select username,city,count(*) from user group by username,city查出每个人在每个城市中的人数,然后对结果集进行遍历统计

    balas
    0
  • PHP中文网

    PHP中文网2017-04-10 13:14:13

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

    结果是:
    张三 共2人 北京1人 上海1人 ...
    李四 共1人 北京1人 上海0人 ...

    实现代码
    select username,count(*) 共几人,sum(case when city='北京' then 1 else 0 end) 北京,sum(case when city='上海' then 1 else 0 end) 上海 from user group by username

    balas
    0
  • PHPz

    PHPz2017-04-10 13:14:13

    如何实现聊天那种分组取最新数据的查询。

    balas
    0
  • Batalbalas