具有多个事务的mysql查询

Posted

技术标签:

【中文标题】具有多个事务的mysql查询【英文标题】:mysql query with multiple transactions 【发布时间】:2012-05-13 14:30:09 【问题描述】:

我有这个示例表结构和记录:

------------------------------
-- 驱动表结构
-- ------------------
如果存在“驱动程序”,则删除表;
创建表`驱动程序`(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `fullname` varchar(100) 整理 utf8_unicode_ci NOT NULL,
  主键(`id`)
) 引擎=InnoDB AUTO_INCREMENT=4 默认字符集=utf8 COLLATE=utf8_unicode_ci;

-- ------------------
--taxi的表结构
-- ------------------
如果存在 `taxi` 则删除表;
创建表`taxi`(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `unit` varchar(5) NOT NULL,
  主键(`id`)
) 引擎=InnoDB AUTO_INCREMENT=4 默认字符集=latin1;

-- ------------------
-- 债务表结构
-- ------------------
如果存在“债务”,则删除表;
创建表`债务`(
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `data` float(10,2) NOT NULL DEFAULT '0.00',
  `driver` bigint(20) NOT NULL,
  `dateadded` 日期时间不为空,
  主键(`id`)
) 引擎=InnoDB AUTO_INCREMENT=22 默认字符集=latin1;

-- ------------------
-- 调度表结构
-- ------------------
如果存在`dispatch`,则删除表;
创建表`调度`(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `driver` int(11) NOT NULL,
  `taxi` int(11) NOT NULL,
  `dispatchdate` 日期 DEFAULT NULL,
  `率`浮动默认'0',
  主键(`id`)
) 引擎=InnoDB AUTO_INCREMENT=1790 默认字符集=latin1;

-- ------------------
-- 还款表结构
-- ------------------
如果存在 `rpayment`,则删除表;
创建表`rpayment`(
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `dateadded` 日期时间默认为 NULL,
  主键(`id`)
) 引擎=InnoDB AUTO_INCREMENT=88 默认字符集=latin1;

-- ------------------
-- rpayment_detail 的表结构
-- ------------------
删除表如果存在`rpayment_detail`;
创建表`rpayment_detail`(
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `rpayment` bigint(20) 非空,
  `dispatch` bigint(20) NOT NULL,
  `金额`浮动默认'0',
  主键(`id`)
) 引擎=InnoDB AUTO_INCREMENT=56 默认字符集=latin1;

-- ------------------
 -  记录
-- ------------------

插入“驱动程序”值('1','DRIVER1');
插入“驱动程序”值('2','DRIVER2');
插入“驱动程序”值('3','DRIVER3');

插入“出租车”值('1','UNIT1');
插入“出租车”值('2','UNIT2');
插入“出租车”值('3','UNIT3');

插入“债务”值('1','100.00','1','2012-04-01 16:07:15');
插入“债务”值('2','200.00','1','2012-04-01 16:25:56');
插入“债务”值('3','300.00','3','2012-04-01 16:34:42');
插入“债务”值('4','400.00','2','2012-04-02 00:11:10');
插入“债务”值('5','200.00','1','2012-04-02 00:57:58');
插入“债务”值(“6”、“500.00”、“3”、“2012-04-02 10:25:39”);
插入“债务”值('7','100.00','2','2012-04-02 11:15:25');

插入“调度”值(“1”、“1”、“1”、“2012-04-01”、“1000”);
插入“调度”值(“2”、“2”、“2”、“2012-04-01”、“1000”);
插入“调度”值(“3”、“3”、“3”、“2012-04-01”、“1000”);
插入“调度”值(“4”、“1”、“1”、“2012-04-02”、“1000”);
插入“调度”值(“5”、“2”、“2”、“2012-04-02”、“1000”);
插入“调度”值(“6”、“3”、“3”、“2012-04-02”、“1000”);

插入“rpayment”值('1','2012-04-30 20:11:16');
插入“rpayment”值('2','2012-05-03 03:25:31');

插入“rpayment_detail”值(“1”、“1”、“1”、“1000”);
插入“rpayment_detail”值(“2”、“1”、“4”、“0”);
插入“rpayment_detail”值(“3”、“2”、“2”、“0”);
插入“rpayment_detail”值(“4”、“2”、“5”、“500”);

我想查看如下结果:

UNIT DRIVER RPAYMENT_TOTAL TOTAL_DEBTS -------------------------------------------------- 单元 1 驱动器 1 1000 500 单元 2 驱动器 2 500 500 单元 3 驱动器 3 0 800

我现在有这个......

SELECT    taxi.unit, driver.fullname, SUM(rpayment_detail.amount) AS rpayment_total, 
          SUM(debts.`data`) AS total_debts 
FROM      driver 
LEFT JOIN debts ON (driver.id = debts.driver) 
LEFT JOIN dispatch ON (driver.id = dispatch.driver) 
LEFT JOIN rpayment_detail ON (dispatch.id = rpayment_detail.dispatch) 
LEFT JOIN rpayment ON (rpayment_detail.rpayment = rpayment.id) 
LEFT JOIN taxi ON (dispatch.taxi = taxi.id) 
GROUP BY  driver.id 
ORDER BY  taxi.unit asc, driver.fullname asc

结果是……

UNIT DRIVER RPAYMENT_TOTAL TOTAL_DEBTS -------------------------------------------------- 单元 1 驱动器 1 3000 1000.00 单元 2 驱动器 2 1000 1000.00 UNIT3 驱动程序 3 空 1600.00

【问题讨论】:

需要rpayment和rpaymetn_details的表结构 对不起,请查看#1。我只是添加了 2 个表结构。 我按要求回答了您的问题,您接受了。然后,您添加了新变量,更改了问题,并且不接受我的答案 - 更改问题并不会使我的答案不可接受。 【参考方案1】:

用你的表结构是做不到的。

您的问题是debts 需要一个外键列到dispatch 而不是driver

如果没有这个,每次调度都会加入每笔债务,实际上是将债务数量乘以司机的调度数量,这就是您所看到的。

【讨论】:

感谢您的想法...但债务与调度是不同的交易。司机即使没有派车也可能欠债。所以调度和债务表不能链接。只有司机。

以上是关于具有多个事务的mysql查询的主要内容,如果未能解决你的问题,请参考以下文章

具有多个分组或排序的mysql查询优化

每个日期/时间具有多个组的 MySQL 查询计数

具有多个连接的 MySQL 查询的低效执行计划

具有多个查询的 php/mysql

具有多个查询的NodeJS mysql连接池

具有多个 AND 语句的 MySQL 查询 [重复]