INSERT INTO на основе результата WHERE в двойном соединении - PullRequest
0 голосов
/ 28 июля 2011

Прежде всего, схема не моя.Это ужасно и очень запутанно.И предупреждение - это сложно.

У меня есть 3 таблицы - tbl_a, tbl_b и tbl_c.switch фактически является собственностью сущностей (записей) в tbl_a.Но он доступен только через JOIN на tbl_b и затем tbl_c:

  +---------+         +---------+         +---------+
  |  tbl_a  |         |  tbl_b  |         |  tbl_c  |
  +---------+         +---------+         +---------+
  | a_id    |    +--> | b_id    |    +--> | c_id    |
  | b_fk    | <--+    | c_fk    | <--+    | switch  |
  +---------+         +---------+         +---------+

  +---------+
  | tbl_his |
  +---------+
  | his_id  |
  | a_fk    |
  | coef    |
  +---------+

Чтобы добавить функцию, мне нужно создать четвертую таблицу (tbl_his) - что я и сделал,В этой таблице у меня есть столбец coef, который может принимать любое число от 1 до 100. Мне нужно заполнить таблицу tbl_his по одной записи на запись tbl_a.С настоящими данными switch это либо 0, либо 1.

Для каждой записи в tbl_a с соответствующим switch из 0 я должен добавить запись к tbl_his как
NULL, 'a_id', '100'

Если для записипереключатель 1 Я должен добавить следующую запись в tbl_his:
NULL, 'a_id', '50'

Будет ли этот запрос выполнять половину работы?Любой способ сделать и 50 записи и 100 записи за один раз?

INSERT INTO `tbl_his` (`his_id`, `a_fk`, `coef`) VALUES (NULL, 'tbl_a.id', '100') 
WHERE (
SELECT tbl_a.id 
FROM tbl_a
LEFT JOIN tbl_b ON tbl_a.b_fk = tbl_b.id
LEFT JOIN tbl_c ON tbl_b.c_fk = tbl_c.c_id
WHERE tbl_c.switch = '0')

Ответы [ 2 ]

3 голосов
/ 28 июля 2011

Синтаксиса запроса INSERT INTO...WHERE не существует. То, что вы хотите, это INSERT INTO...SELECT.

т.е.

INSERT INTO 
  tbl_his (a_fk, coef) 
SELECT 
  tbl_a.id, 
  CASE WHEN tbl_c.switch = 0 THEN 100 ELSE 50 END
FROM
  tbl_a
LEFT JOIN
  tbl_b
ON
  tbl_a.b_fk = tbl_b.id
LEFT JOIN
  tbl_c
ON
  tbl_b.c_fk = tbl_c.c_id

MySQL Manual :: Функции управления потоком

1 голос
/ 28 июля 2011

Бросьте влево на соединения. Ваша статья where находится в незаконном месте. Вставьте значения из запроса и рассчитайте коэф. Если все значения переключателя равны 0 или 1, вы можете удалить последнюю строку.

INSERT INTO tbl_his (his_id, a_fk, coef)
  SELECT NULL, tbl_a.id, 100-50*tbl_c.switch
  FROM tbl_a 
  JOIN tbl_b ON tbl_a.b_fk = tbl_b.id
  JOIN tbl_c ON tbl_b.c_fk = tbl_c.c_id
  WHERE switch BETWEEN 0 AND 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...