有2个表
第一个表是f_city(字段:city_id和字段city_name)
第二个表是f_chengjiao(字段:id、city_id、area、taoshu、fang_time)
关联字段是city_id
我写的语句是 select concat(fc.city_name), sum(fcj.area), sum(fcj.taoshu) from f_chengjiao as fcj left join f_city as fc using (city_id) where .$sql. group by fcj.fang_time order by fc.city_id
出来的结果是下图,重复的地区没有合并相加
回复讨论(解决方案) 分组是 group by fcj.fang_time
很自然会是 重复的地区没有合并相加
因为相同 fc.city_name 可能具有不同的 fcj.fang_time 值(显然是个时间)
分组是 group by fcj.fang_time
很自然会是 重复的地区没有合并相加
因为相同 fc.city_name 可能具有不同的 fcj.fang_time 值(显然是个时间)
谢谢提示,但是现在还有一个问题是在这个统计时间内,有的地区数据因为没有数据就没有添加数据要怎么在sql中让没有添加数据地区显示0呢?
f_chengjiao as fcj left join f_city as fc
改为
f_chengjiao as fcj right join f_city as fc
或
f_city as fc left join f_chengjiao as fcj
谢谢提示,但是现在还有一个问题是在这个统计时间内,有的地区数据因为没有数据就没有添加数据要怎么在sql中让没有添加数据地区显示0呢?
那你得告诉数据库,你所有地区的名单! 就是要将你现在得到的结果集,根据地区这个字段,关联(left/right join)你所有的地区名单
f_chengjiao as fcj left join f_city as fc
改为
f_chengjiao as fcj right join f_city as fc
或
f_city as fc left join f_chengjiao as fcj
还是不能显示出没有添加数据的地区为0的效果,和没修过前一样
谢谢提示,但是现在还有一个问题是在这个统计时间内,有的地区数据因为没有数据就没有添加数据要怎么在sql中让没有添加数据地区显示0呢?
那你得告诉数据库,你所有地区的名单! 就是要将你现在得到的结果集,根据地区这个字段,关联(left/right join)你所有的地区名单
所有的地区都存在第一个表是f_city(字段:city_id和字段city_name)中
你要按 city_name 分组
你要按 city_name 分组
是按city_name
select concat(fc.city_name), sum(fcj.area), sum(fcj.taoshu) from f_chengjiao as fcj right join f_city as fc using (city_id) where .$sql. group by fc.city_name order by fc.city_id
select * from 地区表
left join 统计表 on 地区表.city_name = 统计表.city_name
group by 地区表.city_name
话说这个using (city_id) 东西我不太懂和on有什么区别,所以没在你的sql上改!
select * from 地区表
left join 统计表 on 地区表.city_name = 统计表.city_name
group by 地区表.city_name
话说这个using (city_id) 东西我不太懂和on有什么区别,所以没在你的sql上改!
using (city_id) 是表关联字段的简写
select * from 地区表
left join 统计表 on 地区表.city_name = 统计表.city_name
group by 地区表.city_name
话说这个using (city_id) 东西我不太懂和on有什么区别,所以没在你的sql上改!
city_name不是关联字段,这样搜索不到
city_name不是关联字段,这样搜索不到
你的数据表 的数据 是怎么知道 他属于 哪个城市的, 是用id 还是用 name? 就用那个字段做关联条件!
city_name不是关联字段,这样搜索不到
你的数据表 的数据 是怎么知道 他属于 哪个城市的, 是用id 还是用 name? 就用那个字段做关联条件!
用了,还是不能显示出 没有添加数据城市为0的效果,只会显示添加了数据的结果
我理解出来是这样的!你要的是这个效果吗?
我理解出来是这样的!你要的是这个效果吗?
抱歉回信息晚了,登录帐号的开了大写一直登录不上,帐号被锁定了。
你这里面还用的条件语句吗?不懂这个条件句的意思,能解释下吗
我试着用你写的方法修改了,由于里面要地区求和,用条件语句包裹后就报错了,还有一个问题是,表关联后你搜索城市名怎么不要带上表前缀
1.你这里面还用的条件语句吗?
1)如果你的“条件语句”指的是where,在left join后面加就可以了
2)如果你的条件语句指的是on后面的关系条件,看我12楼的回复,目的是要让数据表知道每条数据来自城市表的哪个城市。
2.地区求和
select city_name,if(toushu is null,0,sum(toushu))
from t_city
left join t_chengjiao on t_city.cid= t_chengjiao.cid
group by t_chengjiao.cid
3.表关联后你搜索城市名怎么不要带上表前缀?
表与表关联之后,没有出现重复名字的字段,可以不加前缀。
1.你这里面还用的条件语句吗?
1)如果你的“条件语句”指的是where,在left join后面加就可以了
2)如果你的条件语句指的是on后面的关系条件,看我12楼的回复,目的是要让数据表知道每条数据来自城市表的哪个城市。
2.地区求和
select city_name,if(toushu is null,0,sum(toushu))
from t_city
left join t_chengjiao on t_city.cid= t_chengjiao.cid
group by t_chengjiao.cid
3.表关联后你搜索城市名怎么不要带上表前缀?
表与表关联之后,没有出现重复名字的字段,可以不加前缀。
我说的条件句是if(toushu is null,0,sum(toushu)),不懂。
我又修改了下,还是不能出来
select concat(fc.city_name), if(fcj.area is null,0,sum(fcj.area)), if(fcj.taoshu is null,0,sum(fcj.taoshu)) from f_city as fc left join f_chengjiao as fcj using (city_id) where .$sql. group by fc.city_id order by fc.city_id
结果如下图(我预留了一个city_id=13的没有添加数据,但是没有显示出来)
你把数据导出来,我测试一下
你总不能让我按你的截图来构造数据表吧
你把数据导出来,我测试一下
你总不能让我按你的截图来构造数据表吧
-- phpmyadmin sql dump-- version 3.5.1-- http://www.phpmyadmin.net---- 主机: localhost-- 生成日期: 2014 年 09 月 13 日 02:48-- 服务器版本: 5.5.24-log-- php 版本: 5.3.13set sql_mode=no_auto_value_on_zero;set time_zone = +00:00;/*!40101 set @old_character_set_client=@@character_set_client */;/*!40101 set @old_character_set_results=@@character_set_results */;/*!40101 set @old_collation_connection=@@collation_connection */;/*!40101 set names utf8 */;---- 数据库: `fang01`---- ------------------------------------------------------------ 表的结构 `f_chengjiao`--create table if not exists `f_chengjiao` ( `id` mediumint(8) unsigned not null auto_increment, `city_id` mediumint(8) not null, `iszhu` char(1) not null default '1' comment '//住宅or非住宅,1是住宅', `area` int(10) not null comment '//面积', `taoshu` int(10) not null comment '//套数', `fang_time` date not null comment '//房地产信息网入库时间', `os_time` datetime not null comment '//入库电脑时间', primary key (`id`)) engine=innodb default charset=utf8 auto_increment=14 ;---- 转存表中的数据 `f_chengjiao`--insert into `f_chengjiao` (`id`, `city_id`, `iszhu`, `area`, `taoshu`, `fang_time`, `os_time`) values(1, 1, '1', 100, 200, '2014-09-01', '2014-09-01 00:00:00'),(2, 2, '1', 100, 200, '2014-09-01', '2014-09-01 00:00:00'),(3, 3, '1', 100, 200, '2014-09-01', '2014-09-01 00:00:00'),(4, 4, '1', 100, 200, '2014-09-01', '2014-09-01 00:00:00'),(5, 5, '1', 100, 200, '2014-09-01', '2014-09-01 00:00:00'),(6, 6, '1', 100, 200, '2014-09-01', '2014-09-01 00:00:00'),(7, 7, '1', 100, 200, '2014-09-01', '2014-09-01 00:00:00'),(8, 8, '1', 100, 200, '2014-09-01', '2014-09-01 00:00:00'),(9, 9, '1', 100, 200, '2014-09-01', '2014-09-01 00:00:00'),(10, 10, '1', 100, 200, '2014-09-01', '2014-09-01 00:00:00'),(11, 11, '1', 100, 200, '2014-09-01', '2014-09-01 00:00:00'),(12, 12, '1', 100, 200, '2014-09-01', '2014-09-01 00:00:00'),(13, 1, '1', 100, 200, '2014-09-08', '2014-09-01 00:00:00');-- ------------------------------------------------------------ 表的结构 `f_city`--create table if not exists `f_city` ( `city_id` mediumint(8) not null, `city_name` varchar(10) not null, primary key (`city_id`)) engine=innodb default charset=utf8;---- 转存表中的数据 `f_city`--insert into `f_city` (`city_id`, `city_name`) values(1, '南昌市'),(2, '东湖区'),(3, '西湖区'),(4, '青山湖区'),(5, '青云谱区'),(6, '湾里区'),(7, '经开区'),(8, '高新区'),(9, '红谷滩区'),(10, '桑海区'),(11, '英雄区'),(12, '南昌县'),(13, '新建县');/*!40101 set character_set_client=@old_character_set_client */;/*!40101 set character_set_results=@old_character_set_results */;/*!40101 set collation_connection=@old_collation_connection */;
检查你的where 语句
检查你的where 语句
where是一个时间段的选择
$sql = '';if($start_time && $end_time){ $sql = fcj.fang_time >='.$start_time.' and fcj.fang_time='2014-09-01' and fcj.fang_time='2014-09-01' and fcj.fang_time<='2014-09-13'
那有什么可奇怪的?
f_chengjiao 表中并无 新建县 的数据,如果按时间段过滤,必然会把他过滤掉
如果还想保有全部的 city_name 则需要这样写
select city_name, sum(area) as `面积`,sum(taoshu) as `套数` from f_city left join (select * from f_chengjiao where 条件) t on f_city.city_id=t.city_id group by f_city.city_id
这里怎么有一个t,干嘛用的,用了你的写法全部都出来了,没有搞懂你这么写(select * from f_chengjiao where 条件)的意思,这里搜索了全部的字段了和直接用f_chengjiao 的差别 没有弄懂 你不能理解
select * from f_chengjiao where 条件
的含义???
1.这里怎么有一个t,干嘛用的
t 只是关联临时表的一个别名,没有特殊意义,你祛掉,他就会报错。
2.差别
1)写法一,先关联后搜索,这样的话不满足条件的记录(新建县)就不会被显示出来。(要理解这句话很简单,你select * 出来看看,有些记录是不满足你的where条件的)
2)写法二,先搜索(f_chengjiao)后关联,这样就不会影响到最后的结果数。
你不能理解
select * from f_chengjiao where 条件
的含义???
含义我知道,但是where 为什么要先放到f_chengjiao中,而不是放到外面
1.这里怎么有一个t,干嘛用的
t 只是关联临时表的一个别名,没有特殊意义,你祛掉,他就会报错。
2.差别
1)写法一,先关联后搜索,这样的话不满足条件的记录(新建县)就不会被显示出来。(要理解这句话很简单,你select * 出来看看,有些记录是不满足你的where条件的)
2)写法二,先搜索(f_chengjiao)后关联,这样就不会影响到最后的结果数。
哦懂了,但是别名是要用as吗?
所有的 as 都是可以省略的
所有的 as 都是可以省略的
原来是这样的,我看书里面都是要求写上as,同时我还想问一个问题,就是按你的要求写,f_chengjiao表都搜索了2次了,效率会不会低了点,以后这块数据多了,要怎么简写下? 1、这是按你的要求,而不是我的要求
2、f_chengjiao表只搜索了1次,怎么是2次呢?
1、这是按你的要求,而不是我的要求
2、f_chengjiao表只搜索了1次,怎么是2次呢?
第一次搜索的city_name、area、taoshu是表f_chengjiao中的
第二次搜索了select * from f_chengjiao,这不是2次吗?