MySQL 怎样分组查询

php中文网
发布: 2016-06-06 20:51:48
原创
1587人浏览过

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

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

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

select username,city,count(*)
from user
group by username
登录后复制

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

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

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

网龙b2b仿阿里巴巴电子商务平台
网龙b2b仿阿里巴巴电子商务平台

本系统经过多次升级改造,系统内核经过多次优化组合,已经具备相对比较方便快捷的个性化定制的特性,用户部署完毕以后,按照自己的运营要求,可实现快速定制会费管理,支持在线缴费和退费功能财富中心,管理会员的诚信度数据单客户多用户登录管理全部信息支持审批和排名不同的会员级别有不同的信息发布权限企业站单独生成,企业自主决定更新企业站信息留言、询价、报价统一管理,分系统查看分类信息参数化管理,支持多样分类信息,

网龙b2b仿阿里巴巴电子商务平台 0
查看详情 网龙b2b仿阿里巴巴电子商务平台
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>';		

?>
登录后复制

回复内容:

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

?>
登录后复制

先执行

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,
      ...
  ],
  ...
]
登录后复制

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

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

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号