Сложить данные из трёх таблиц в четвертую

250
04 ноября 2017, 13:08

Дано: три больших таблицы (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?

Answer 1

Это будет что-то вроде

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. Но как я понял, это синтетический ключ, значение которого не нужно.

Answer 2

Вот таким образом можно сделать:

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
Answer 3

Вот так:

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
READ ALSO
Проблемы с подключением к БД

Проблемы с подключением к БД

Салют! Не могу понять что происходит не так с подключением к базе данныхПодключаюсь под админом

268
Что происходит, когда в БД накапливается более 100+млн записей?

Что происходит, когда в БД накапливается более 100+млн записей?

Всем приветСтало интересно, а что происходит, когда в БД (MySQL) накапливается более 100+млн записей? Они как-либо архивируются/как происходит...

229
Как можно хранить/описывать объекты

Как можно хранить/описывать объекты

Стоит задача написать некую среду для моделированияВ ней пользователю предложены какие-то готовые модельки и алгоритмы

267
Помогите придумать парсер [дубликат]

Помогите придумать парсер [дубликат]

На данный вопрос уже ответили:

294