是按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上改!
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的没有添加数据,但是没有显示出来)
SELECT city_name, sum(area) as `面积`,sum(taoshu) as `套数` FROM f_city left join f_chengjiao on f_city.city_id=f_chengjiao.city_id group by f_city.city_id
奇怪了,我在8楼写的那个语句和你的差不多,怎么就是不能出来,你能告诉我是那里错了吗? 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_id ORDER BY fc.city_id
那有什么可奇怪的? 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
打印了一个时间段: fcj.fang_time >='2014-09-01' AND fcj.fang_time<='2014-09-13'
不是这样写的吗?只有这样写才能出来,不然你看下31楼,打印的条件是 fcj.fang_time >='2014-09-01' AND fcj.fang_time<='2014-09-13'
这里怎么有一个t,干嘛用的,用了你的写法全部都出来了,没有搞懂你这么写(select * from f_chengjiao where 条件)的意思,这里搜索了全部的字段了和直接用f_chengjiao 的差别 没有弄懂
你不能理解 select * from f_chengjiao where 条件 的含义???
1.这里怎么有一个t,干嘛用的 t 只是关联临时表的一个别名,没有特殊意义,你祛掉,他就会报错。 2.差别 1)写法一,先关联后搜索,这样的话不满足条件的记录(新建县)就不会被显示出来。(要理解这句话很简单,你select * 出来看看,有些记录是不满足你的where条件的) 2)写法二,先搜索(f_chengjiao)后关联,这样就不会影响到最后的结果数。
很自然会是 重复的地区没有合并相加
因为相同 fc.city_name 可能具有不同的 fcj.fang_time 值(显然是个时间)
谢谢提示,但是现在还有一个问题是在这个统计时间内,有的地区数据因为没有数据就没有添加数据要怎么在sql中让没有添加数据地区显示0呢?
改为
f_chengjiao AS fcj RIGHT JOIN f_city AS fc
或
f_city AS fc LEFT JOIN f_chengjiao AS fcj
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
left JOIN 统计表 ON 地区表.city_name = 统计表.city_name
GROUP BY 地区表.city_name话说这个USING (city_id) 东西我不太懂和on有什么区别,所以没在你的sql上改!
USING (city_id) 是表关联字段的简写
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.表关联后你搜索城市名怎么不要带上表前缀?
表与表关联之后,没有出现重复名字的字段,可以不加前缀。
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 */;
if($start_time && $end_time){
$sql = " fcj.fang_time >='".$start_time."' AND fcj.fang_time<='".$end_time."' ";
}else if($start_time)
{
$sql = " fcj.fang_time ='".$start_time."' ";
}else if($end_time)
{
$sql = " fcj.fang_time ='".$end_time."' ";
}else
{
$sql = " fcj.city_id='".$city."' ";
}
FROM f_city left join f_chengjiao on f_city.city_id=f_chengjiao.city_id
group by f_city.city_id
奇怪了,我在8楼写的那个语句和你的差不多,怎么就是不能出来,你能告诉我是那里错了吗?
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_id ORDER BY fc.city_id
还真是where造成的,但是我把where去掉,我就不能选择查询在一个时间段内的结果了
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
打印了一个时间段:
fcj.fang_time >='2014-09-01' AND fcj.fang_time<='2014-09-13'
不是这样写的吗?只有这样写才能出来,不然你看下31楼,打印的条件是
fcj.fang_time >='2014-09-01' AND fcj.fang_time<='2014-09-13'
这里怎么有一个t,干嘛用的,用了你的写法全部都出来了,没有搞懂你这么写(select * from f_chengjiao where 条件)的意思,这里搜索了全部的字段了和直接用f_chengjiao 的差别 没有弄懂
select * from f_chengjiao where 条件
的含义???
t 只是关联临时表的一个别名,没有特殊意义,你祛掉,他就会报错。
2.差别
1)写法一,先关联后搜索,这样的话不满足条件的记录(新建县)就不会被显示出来。(要理解这句话很简单,你select * 出来看看,有些记录是不满足你的where条件的)
2)写法二,先搜索(f_chengjiao)后关联,这样就不会影响到最后的结果数。
含义我知道,但是where 为什么要先放到f_chengjiao中,而不是放到外面
原来是这样的,我看书里面都是要求写上as,同时我还想问一个问题,就是按你的要求写,f_chengjiao表都搜索了2次了,效率会不会低了点,以后这块数据多了,要怎么简写下?
2、f_chengjiao表只搜索了1次,怎么是2次呢?
第一次搜索的city_name、area、taoshu是表f_chengjiao中的
第二次搜索了SELECT * FROM f_chengjiao,这不是2次吗?