具有多个事务的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查询的主要内容,如果未能解决你的问题,请参考以下文章