2 mlunwen mlunwen 于 2016.01.14 13:28 提问

ThinkPHP达人,一个非常复杂的SQL查询,用TP框架如何实现?
 SELECT `app_plan`.*,
       `app_agreement`.*,
       `app_customer`.*,
       `app_product`.*,
       `app_product_category`.*,
       @计划总原发量:=(
select sum(`app_operation`.`send_weight`)
  from `app_operation`
 where `app_operation`.`plan_id`= `app_plan`.`plan_id`
   AND `app_operation`.`is_del`= 0) as `plan_total_send_weight`,
         @计划总实收量:=(
select sum(`app_operation`.`receive_weight`)
  from `app_operation`
 where `app_operation`.`plan_id`= `app_plan`.`plan_id`
   AND `app_operation`.`is_del`= 0) as `plan_total_receive_weight`,
         @计划总路损量:= IFNULL((
select sum(`app_operation`.`send_weight`-`app_operation`.`receive_weight`)
  from `app_operation`
 where `app_operation`.`plan_id`= `app_plan`.`plan_id`
   AND `app_operation`.`is_del`= 0
   AND `app_operation`.`operation_status`= 2), 0) as `plan_total_lost_quantity`,
         @计划总在途量:= IFNULL((
select sum(`app_operation`.`send_weight`)
  from `app_operation`
 where `app_operation`.`plan_id`= `app_plan`.`plan_id`
   AND `app_operation`.`is_del`= 0
   AND `app_operation`.`operation_status`= 1), 0) as `plan_onway_quantity`,
         @计划路损超出量:= IFNULL((
SELECT sum(`app_operation`.`send_weight`-`app_operation`.`receive_weight`- `app_plan`.`rational_loss`)
  from `app_operation`
 where `app_operation`.`plan_id`= `app_plan`.`plan_id`
   and `app_operation`.`is_del`= 0
   AND `app_operation`.`operation_status`= 2
   AND(`send_weight`-`receive_weight`)> `app_plan`.`rational_loss`), 0) AS plan_over_lost, @路损超出扣款:= truncate(IFNULL((
SELECT sum((`app_operation`.`send_weight`-`app_operation`.`receive_weight`- `app_plan`.`rational_loss`) * `app_plan`.`plan_deduct_fee`)
  from `app_operation`
 where `app_operation`.`plan_id`= `app_plan`.`plan_id`
   and `app_operation`.`is_del`= 0
   AND `app_operation`.`operation_status`= 2
   AND(`send_weight`-`receive_weight`)> `app_plan`.`rational_loss`), 0), 2) AS plan_total_punish_fee, @计划总发车数:= IFNULL((
select count(*)
  from `app_operation`
 where `app_operation`.`plan_id`= `app_plan`.`plan_id`
   AND `app_operation`.`is_del`= 0), 0) as `plan_count_send`, @计划总收车数:= IFNULL((
select count(*)
  from `app_operation`
 where `app_operation`.`plan_id`= `app_plan`.`plan_id`
   AND `app_operation`.`operation_status`= 2
   AND `app_operation`.`is_del`= 0), 0) as `plan_count_receive`, @总运费:= truncate(IFNULL((
SELECT sum(`app_operation`.`receive_weight` * `app_operation`.`operation_fee`)
  FROM `app_operation`
 WHERE `app_operation`.plan_id= `app_plan`.`plan_id`
   AND `app_operation`.`is_del`= 0), 0), 2) as `plan_total_ship_fee`, @应付运费:= truncate(IFNULL((@总运费 - @路损超出扣款), 0), 2) AS total_invoice_ship_fee, @计划未发量:= truncate(IFNULL(`plan_total_quantity` - @计划总实收量 - @计划总在途量, 0), 2) AS `plan_total_not_quantity`
  FROM(`app_plan`)
  LEFT JOIN `app_agreement` ON `app_plan`.`agreement_id`= `app_agreement`.`agreement_id`
  LEFT JOIN `app_customer` ON `app_agreement`.`customer_id`= `app_customer`.`customer_id`
  LEFT JOIN `app_product` ON `app_agreement`.`product_id`= `app_product`.`product_id`
  LEFT JOIN `app_product_category` ON `app_product`.`category_id`= `app_product_category`.`category_id`
 WHERE `plan_status`= 1
   AND `app_plan`.`is_del`= 0

附件是数据库SQL备份。
大家尝试看看,这应该算相当复杂的SQL了吧。

图片说明
数据库备份

1个回答

devmiao
devmiao   Ds   Rxr 2016.01.20 03:50
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
如何查看一个网站用的是不是thinkphp框架
虽然说框架,应用目录,缓存目录都可以放在网站根目录外。但是不是用thinkphp开发的,还是有窍门: 识别Thinkphp的指纹:4e5e5d7364f443e28fbf0d3ae744a59a 在tp3.1和3.2中的App.class.php中有这样一段代码 <?php if(!$module) { if('4e5e5d7364f443e28fbf0d3ae744a59a
tp框架利用model模型CRUD操作
1.  添加数据     add()方法,返回新纪录的主键id值     两种方式:数组、AR方式      2. 删除数据     delete()  其返回删除的记录数目     delete(id)  or  delete("id1,id2,id3") 3. 修改数据     save()  其返回修改的记录数目     两种方式:数组、AR      4. 查询数据     sel
ThinkPHP中的getLastSql函数---获取上次执行的SQL语句
Thinkphp是我们经常用使用的一个php的MVC框架。通常我们把业务分类,分层,在不同的层处理不同的业务逻辑。 本文要讲的是model层,关于获取上次执行的SQL语句的问题。(用于日志记录,或者分析出错原因等)。 1:model层的一般情况 通常,我们是通过集成系统Model类的方式来实现的。比如:class UserModel extends Model;(此文不多考虑命名空间
ThinkPHP 中 获取最后一次执行sql语句 和变量调试
ThinkPHP中获取最后一次执行sql语句的 方法有两种: 其一是 调用模型 获取 如,$sql = $model ->getLastSql(); Thinkphp中Model类,有getLastSql这个函数,甚至还有,getLastInsID,getDbError,getError,getPk,getDbFields等函数。这些函数都是我们经常可能会用到的model层的函数。 其二
TP框架-导入与导出
导入数据 //防止中文乱码 header('content-type:text/html;charset=utf-8'); include 'excel_reader.php';//引入导入文件 $data = new Spreadsheet_Excel_Reader(); //实力化类 $data->read('./xls/aaaa.xls'); //导入php数组形式 //
查看thinkphp框架 版本的办法
THINK_VERSION  常量   (tp3 以及p5通用)
ThinkPHP之诡异sql查询
史上最牛X 的SQL,我用过的,来纪念自己的不灵活
从零开始了解thinkphp框架,tp框架基础教程
工作很长时间没有用到thinkphp框架了,差不多都要忘干净了,今天就重温一下tp框架。 首先要下载thinkphp最新版本3.2.2版本,下载地址http://www.thinkphp.cn/donate/download/id/502.html。建立一个项目,将压缩包解压后的所有文件放到项目中,然后配置apach服务器,打开浏览器,输出网址localhost,页面会提示“欢迎使用thinkp
ThinkPHP快速简单实现Ajax地区三级联动(很详细)
首先呢,我们准备好TP框架还有一个表,地区表,其中包含以下字段: 建表语句: CREATE TABLE `tp_region` (   `region_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,   `parent_id` smallint(5) unsigned NOT NULL DEFAULT '0',   `r
PHP之——thinkphp3.x中数据的查询-区间查询、统计查询等等
由于业务逻辑的差异,CURD操作往往不是那么简单,尤其是复杂的业务逻辑下面,这也是ActiveRecord模式的不足之处。ThinkPHP的查询语言配合连贯操作可以很好解决复杂的 业务逻辑需求,本篇我们就首先来深入了解下框架的查询语言。 一、介绍 ThinkPHP内置了非常灵活的查询方法,可以快速的进行数据查询操作,查询条件可以用于读取、更新和删除等操作,主要涉及到where方法等连贯操作