2012-05-04 5 views
0

я есть этот пример структуры таблицы и записи:MySQL запросов с несколькими транзакциями

-- ---------------------------- 
-- Table structure for driver 
-- ---------------------------- 
DROP TABLE IF EXISTS `driver`; 
CREATE TABLE `driver` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `fullname` varchar(100) COLLATE utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

-- ---------------------------- 
-- Table structure for taxi 
-- ---------------------------- 
DROP TABLE IF EXISTS `taxi`; 
CREATE TABLE `taxi` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `unit` varchar(5) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1; 

-- ---------------------------- 
-- Table structure for debts 
-- ---------------------------- 
DROP TABLE IF EXISTS `debts`; 
CREATE TABLE `debts` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `data` float(10,2) NOT NULL DEFAULT '0.00', 
    `driver` bigint(20) NOT NULL, 
    `dateadded` datetime NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=latin1; 

-- ---------------------------- 
-- Table structure for dispatch 
-- ---------------------------- 
DROP TABLE IF EXISTS `dispatch`; 
CREATE TABLE `dispatch` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `driver` int(11) NOT NULL, 
    `taxi` int(11) NOT NULL, 
    `dispatchdate` date DEFAULT NULL, 
    `rate` float DEFAULT '0', 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=1790 DEFAULT CHARSET=latin1; 

-- ---------------------------- 
-- Table structure for rpayment 
-- ---------------------------- 
DROP TABLE IF EXISTS `rpayment`; 
CREATE TABLE `rpayment` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `dateadded` datetime DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=88 DEFAULT CHARSET=latin1; 

-- ---------------------------- 
-- Table structure for rpayment_detail 
-- ---------------------------- 
DROP TABLE IF EXISTS `rpayment_detail`; 
CREATE TABLE `rpayment_detail` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `rpayment` bigint(20) NOT NULL, 
    `dispatch` bigint(20) NOT NULL, 
    `amount` float DEFAULT '0', 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=56 DEFAULT CHARSET=latin1; 

-- ---------------------------- 
-- Records 
-- ---------------------------- 

INSERT INTO `driver` VALUES ('1', 'DRIVER1'); 
INSERT INTO `driver` VALUES ('2', 'DRIVER2'); 
INSERT INTO `driver` VALUES ('3', 'DRIVER3'); 

INSERT INTO `taxi` VALUES ('1', 'UNIT1'); 
INSERT INTO `taxi` VALUES ('2', 'UNIT2'); 
INSERT INTO `taxi` VALUES ('3', 'UNIT3'); 

INSERT INTO `debts` VALUES ('1','100.00', '1', '2012-04-01 16:07:15'); 
INSERT INTO `debts` VALUES ('2','200.00', '1', '2012-04-01 16:25:56'); 
INSERT INTO `debts` VALUES ('3','300.00', '3', '2012-04-01 16:34:42'); 
INSERT INTO `debts` VALUES ('4','400.00', '2', '2012-04-02 00:11:10'); 
INSERT INTO `debts` VALUES ('5','200.00', '1', '2012-04-02 00:57:58'); 
INSERT INTO `debts` VALUES ('6','500.00', '3', '2012-04-02 10:25:39'); 
INSERT INTO `debts` VALUES ('7','100.00', '2', '2012-04-02 11:15:25'); 

INSERT INTO `dispatch` VALUES ('1', '1', '1', '2012-04-01', '1000'); 
INSERT INTO `dispatch` VALUES ('2', '2', '2', '2012-04-01', '1000'); 
INSERT INTO `dispatch` VALUES ('3', '3', '3', '2012-04-01', '1000'); 
INSERT INTO `dispatch` VALUES ('4', '1', '1', '2012-04-02', '1000'); 
INSERT INTO `dispatch` VALUES ('5', '2', '2', '2012-04-02', '1000'); 
INSERT INTO `dispatch` VALUES ('6', '3', '3', '2012-04-02', '1000'); 

INSERT INTO `rpayment` VALUES ('1', '2012-04-30 20:11:16'); 
INSERT INTO `rpayment` VALUES ('2', '2012-05-03 03:25:31'); 

INSERT INTO `rpayment_detail` VALUES ('1', '1', '1', '1000'); 
INSERT INTO `rpayment_detail` VALUES ('2', '1', '4', '0'); 
INSERT INTO `rpayment_detail` VALUES ('3', '2', '2', '0'); 
INSERT INTO `rpayment_detail` VALUES ('4', '2', '5', '500'); 

и я хочу, чтобы посмотреть результат, как в следующем:

 
UNIT  DRIVER  RPAYMENT_TOTAL  TOTAL_DEBTS 
-------------------------------------------------- 
UNIT1 DRIVER1 1000    500 
UNIT2 DRIVER2 500    500 
UNIT3 DRIVER3 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 
-------------------------------------------------- 
UNIT1 DRIVER1 3000    1000.00 
UNIT2 DRIVER2 1000    1000.00 
UNIT3 DRIVER3 null    1600.00 
+2

нужна структура таблицы для rpayment и rpaymetn_details – GDP

+0

Извините, пожалуйста, проверьте сообщение №1. Я просто добавляю 2 структуры таблицы. – noister

+0

Пожалуйста, помогите ... :( – noister

ответ

0

Это не может быть сделано со структурой стола, которую у вас есть.

Ваша проблема в том, что debts нуждается в колонке с внешним ключом до dispatch вместо driver.

Без этого каждый долг будет объединен для каждой отправки, эффективно умножая количество долгов на количество отправлений для водителя, что и есть то, что вы видите.

+0

спасибо за идею ... но долги - это другая транзакция, чем отправка. У водителей могут быть долги, даже если они не отправляются, поэтому таблица отправки и задолженности не может быть ссылкой. Только драйвер. – noister

Смежные вопросы