ホームページ > バックエンド開発 > PHPチュートリアル > 期間内の各領域のデータを合計すると、繰り返し領域が合計されていないことがわかります。

期間内の各領域のデータを合計すると、繰り返し領域が合計されていないことがわかります。

WBOY
リリース: 2016-06-23 13:49:30
オリジナル
1120 人が閲覧しました

2 つのテーブルがあります
最初のテーブルは f_city (フィールド: city_id とフィールド city_name)
2 番目のテーブルは 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 値を持っている可能性があるため、マージされ追加されました


ヒントをありがとう、しかし、この統計期間中に、一部の地域データが更新されていないという別の問題が発生しました。データがないので追加しました。追加したデータ領域が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と表示するにはどうすればよいですか?

次に、すべての地域のリストをデータベースに伝える必要があります。現在取得している結果セットは、地域フィールドに基づいて、すべての地域リスト

f_chengjiao AS fcj LEFT JOIN f_city AS fc

または
f_city AS fc LEFT JOIN f_chengjiao AS fcj
を関連付けることです。

まだ修復前と同じように、データが追加されていない領域に 0 の効果を表示できません



ヒントをありがとう、しかし今、この統計期間中に別の問題が発生しました。データが存在しないため、地域データが追加されていません。 SQL でデータが追加されていない領域を 0 と表示するにはどうすればよいですか?

次に、すべての地域のリストをデータベースに伝える必要があります。現在取得している結果セットは、region フィールドに基づいてすべての地域リストを関連付け (左/右結合) することです


すべての地域は最初のテーブル f_city (フィールド: city_id とフィールド city_name) に存在します


グループ化する必要がありますby city_name

あなたは city_name によってグループ化する必要があります

by 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 地域テーブル.都市名 = 統計テーブル.都市名

GROUP BY 地域テーブル.都市名


そういえば, USING (city_id) と on の違いがよくわからないので、SQL で変更しませんでした。


SELECT * FROM 地域表

left JOIN 統計表 ON 地域表.市名 = 統計表.市名

GROUP BY 地域表.市名


そういえば、この USING (city_id) の違いがよくわかりません。 SQLではそれを変更しませんでした。


USING (city_id) はテーブル関連付けフィールドの略称です



SELECT * FROM 地域テーブル

left JOIN 統計テーブル ON 地域テーブル.city_name = 統計テーブル.city_name

GROUP BY 地域テーブル.city_name


これについて話しましょうUSING (city_ ID ) something と on の違いがよくわからないので、SQL では変更しませんでした。


city_name は関連フィールドではないため、検索できません


city_name は関連フィールドではないため、検索できません

データ テーブル内のデータがどの都市に属しているかをどのように確認しますか? ID または名前を使用しますか?そのフィールドを関連付け条件として使用するだけです。


city_name は関連フィールドではないため、検索できません

データテーブルのデータがどの都市に属しているかをどのように確認しますか? ID または名前を使用しますか?そのフィールドを関連付け条件として使用するだけです。


用了,还是不能显示出 没有添加数据城市为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<='".$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."' ";}
ログイン後にコピー

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
ログイン後にコピー
ログイン後にコピー

右链接也是一样的

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
ログイン後にコピー

你先把你的where语句去掉先

你先把你的where语句去掉先



还真是where造成的,但是我把where去掉,我就不能选择查询在一个时间段内的结果了

不是说你不能加where 是你的where有问题 在php echo你的sql语句,放到mysql去检查~ 看看是哪里有问题!

那有什么可奇怪的?
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
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

那有什么可奇怪的?
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
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー



我数据库中搜索了,并没有过滤掉,你看看

你那是什么条件表达式?

不是说你不能加where 是你的where有问题 在php echo你的sql语句,放到mysql去检查~ 看看是哪里有问题!



打印了一个时间段:
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' 
ログイン後にコピー
ログイン後にコピー

那有什么可奇怪的?
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次吗?
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート