Обновите значение одной таблицы с суммированным значением связанной таблицы, используя промежуточную таблицу - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть три таблицы A, A_B и B.
Поскольку mySQL не поддерживает многие отношения, таблицы A и B связаны между собой промежуточной таблицей A_B.

Table A:    Table A_B:  Table B:
aId aCount  aId bId     bId bCo
1   10      1   1       1   4
2   15      1   2       2   5
3   20      2   1       3   6
            3   2       4   7
            3   4

Теперь я хочу добавить bCount каждого bId к каждому связанному aCount.
Желаемый результат:

Table A:    Remark:
aId aCount  (Current aCount + all related bCounts)
1   19      (10 + 4 + 5)
2   19      (15 + 4)
3   32      (20 + 5 + 7)

Мои знания MySQL слишком базовы.
Я могу создать запрос SELECT, который даст мне результаттаблица, как я хочу, чтобы таблица A выглядела после обновления, но я не могу создать оператор обновления.Все, что я пробовал, приводило к синтаксическим ошибкам или нежелательным результатам.У меня также было одно утверждение, которое могло бы сработать, но его выполнение заняло много времени.Теперь я просто запутался в том, что делать.
Желаемый результат выглядит следующим образом:

SELECT `aId`, aCount + SUM(`bCount`) as `aCount` from `A`
INNER JOIN `A_B` ON `A_B`.`aId` =   `A`.`aId`
INNER JOIN `B`   ON   `B`.`bId` = `A_B`.`bId`
GROUP BY `aId`;

Возможно ли обновление, которое я хочу, даже с одним запросом, или мне нужно несколько (с точки зрения производительности)?
Может кто-нибудь помочь мне с подходом или с созданием утверждений?

1 Ответ

0 голосов
/ 27 сентября 2018

Попробуйте ниже: https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=0b6a287d41eed001710e94612c4228ba

select x.id,x.val,sum(tableb.val)+x.val as vals from 
(select * from tablea inner join tableab on tablea.id=tableab.id1) x inner join
tableb on x.id2=tableb.id 
group by x.id,x.val,id1

Вывод:

id  val vals
1   10  19
2   15  19
3   20  32

Для обновления таблицы:

UPDATE tablea INNER JOIN
(SELECT x.id, x.val, SUM(tableb.val) + x.val as vals FROM
    (SELECT * FROM tablea INNER JOIN tableab ON tablea.id = tableab.id1) x INNER JOIN
    tableb ON x.id2 = tableb.id 
    GROUP BY x.id, x.val, id1)Z ON tablea.id=Z.id 
SET tablea.val = Z.vals;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...