Дано: три больших таблицы (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
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости