Mysql, вставить в таблицу из каждой записи из другой таблицы

0

У меня есть 2 таблицы:

table_com
-------------
id_com|code|value|
----------------
1     |10  | A
2     |20  | B


table_b
----------
id_b|code
----------
1   |10
2   |20
3   |30

Я хочу вставить в table_com каждый реестр, который существует в table_b, но не в table_com (по code), в примере будет id_b==3, потому что этот код = 30 он отсутствует в table_a, а для значения, Мне нужно поставить 0. Окончательный table_com должен выглядеть следующим образом:

table_com
-------------
id_com|code|value|
-----------------
1     |10  | A
2     |20  | B
3     |30  | 0

Я работаю с php, я попробовал значение foreach table_b и попытался вставить значения, как я уже сказал, но не уверен, как это сделать (я знаю, что с INSERT INTO я не могу использовать WHERE, это просто пример):

foreach ($comunas as $key => $value) {
            $code = $value->code;
            DB::select(DB::raw(" 
                INSERT INTO rgl_clientes_comuna (
                    code,
                    value
                ) 
                VALUES
                    ($code, 0,)
                WHERE code IS NOT $code
            "));
        }

РЕДАКТИРОВАТЬ:

1) Для первого ответа я попробовал это (с моими настоящими данными):

INSERT INTO rgl_clientes_comuna (
    comuna_id,
    numero_clientes
) SELECT
    cod_comuna,
    0
FROM
    rgl_cut ON DUPLICATE KEY UPDATE comuna_id = 12201

Он работает, но он добавляет новую строку для каждого реестра на table_b

Теги:

2 ответа

1
Лучший ответ

Как насчет этого?

insert into table_com
  select id_b, code, 0
    from table_b where id_b not in (select id_com from table_com);

или это?

insert into table_com
  select id_b, code, 0
    from table_b where code not in (select code from table_com);

поскольку я не понимаю, является ли решающим фактором наличие id или code

  • 0
    Я проверю это, если это будет работать, я выберу это как правильное, потому что не изменяя свойства столбцов (уникально)
  • 0
    Господи, я люблю тебя! Я меняю некоторые идентификаторы, потому что это было не совсем то, что мне нужно, а вся идея - использовать not in (select черт возьми, спасибо! (Я использую первый код)
2

Я бы просто использовал insert on duplicate key update:

insert into a (code, value)
    select code, 0
    from b
    on duplicate key update code = values(code);

Чтобы это сработало, вам нужен уникальный индекс/ограничение a(code).

  • 0
    Я отредактировал свой вопрос с комментарием к этому ответу.
  • 0
    Ах, я скучаю по UPDATE
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню