Дано: три больших таблицы (first, second, third) вида
CREATE TABLE `first` (
`id` bigint(20) NOT NULL,
`chr` int(11) NOT NULL,
`left` bigint(20) NOT NULL,
`right` bigint(20) NOT NULL,
`count` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
содержащих данные и четвертая (такая же) - пустая.
chr, left, right - сочетание этих трёх параметров уникально, т.е. {1, 4567, 4689} встретится не более одного раза в каждой таблице. Задача: Просуммировать поле count всех трёх таблиц для каждого сочетания {chr, left, right} и внести данные в четвёртую таблицу. Причем, возможны ситуации, когда конкретное сочетание не встречается в одной или двух таблицах
Как это сделать сторонними средствами - знаю. Возможно ли сделать это средствами MySQL?
Это будет что-то вроде
CREATE TABLE `forth` (
`chr` int(11) NOT NULL,
`left` bigint(20) NOT NULL,
`right` bigint(20) NOT NULL,
`count` int(11) NOT NULL,
UNIQUE KEY `chr_left_right` (`chr`, `left`, `right`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
INSERT INTO `forth` (`chr`, `left`, `right`, `count`)
SELECT `chr`, `left`, `right`, `count`
FROM `first`;
INSERT INTO `forth` (`chr`, `left`, `right`, `count`)
SELECT `chr`, `left`, `right`, `count` cnt
FROM `second`
ON DUPLICATE KEY UPDATE
`count` = `count` + cnt;
INSERT INTO `forth` (`chr`, `left`, `right`, `count`)
SELECT `chr`, `left`, `right`, `count` cnt
FROM `third`
ON DUPLICATE KEY UPDATE
`count` = `count` + cnt;
В вопросе не сказано, что делать с полем ID. Но как я понял, это синтетический ключ, значение которого не нужно.
Вот таким образом можно сделать:
INSERT INTO summary (`chr`, `left`, `right`, `count`)
SELECT `chr`, `left`, `right`, SUM(`count`) FROM (
SELECT `chr`, `left`, `right`, `count` FROM first
UNION ALL
SELECT `chr`, `left`, `right`, `count` FROM second
UNION ALL
SELECT `chr`, `left`, `right`, `count` FROM third
) s
Вот так:
INSERT INTO fourth (`chr`, `left`, `right`, `count`)
select chr, left,right, SUM (count) as sum_
from (select chr, left,right, count
from first
union all
select chr, left,right, count
from second
union all
select chr, left,right, count
from third)
group by chr, left,right
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости