Home > Backend Development > PHP Tutorial > MySQL 怎样分组查询

MySQL 怎样分组查询

WBOY
Release: 2016-06-06 20:51:48
Original
1331 people have browsed it

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

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

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

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

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

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

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

select username,city,count(*)
from user
group by username,city
Copy after login
Copy after login
张三 1
张三 1
李四 1
Copy after login
Copy after login

我需要的结果是:

张三 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 '
Copy after login
Copy after login
'; for ($i=0;$ifetch_assoc(); echo ''; foreach($rows as $cols){ echo ''; } echo ''; } echo '
'.$cols.'
'; ?>

回复内容:

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

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

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

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

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

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

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

select username,city,count(*)
from user
group by username,city
Copy after login
Copy after login
张三 1
张三 1
李四 1
Copy after login
Copy after login

我需要的结果是:

张三 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 '
Copy after login
Copy after login
'; for ($i=0;$ifetch_assoc(); echo ''; foreach($rows as $cols){ echo ''; } echo ''; } echo '
'.$cols.'
'; ?>

先执行

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

搜出来的结果(简写):

[
  0 => [
    username => name1,
    city => city1,
    count => 1
  ],
  1 => [
    username => name1,
    city => city2,
    count => 2
  ],
  ...
]
Copy after login

假设结果保存在$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'];
}
Copy after login

当然这是按我自己喜欢的结构存的,你也可以修改成你喜欢的结构。出来的结果如下(简写):

[
  user1 => [
    total => 3,
    detail => [
      city1 => 1,
      city2 => 2,
      ...
  ],
  ...
]
Copy after login

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查出每个人在每个城市中的人数,然后对结果集进行遍历统计

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

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

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template