Множественный выбор в операторе вставки - mySQL

0

У меня 2 таблицы.

1.

**code**
id
name

2.

**code_category**
id
code_id
category_id
discount

У меня есть список из 15000 кодов в базе данных без code_category. У меня есть только один образец для ссылки в code_category. Я должен добавить в категорию code_category 20 категорий для кода.

Я думаю о том, чтобы левый соединился с обеими таблицами, чтобы получить, где code_id имеет значение null, которое получает мне все незакрепленные коды, но мне нужен другой оператор select, чтобы получить 20 разных типов строк code_category для ввода кода.

insert into code_category (code_id, category_id, discount)
values
    (select id from code c
    left join code_category cc on cc.code_id = c.id
    where cc.code_id is null)
    union 
    (select categoryid, discount from code_category where c.id = 123)

123 является ссылочным идентификатором.

  • 0
    Ожидается, что вы попытаетесь написать код самостоятельно . Проведите дополнительное исследование, если у вас возникли проблемы, опубликуйте информацию о том, что вы пробовали, с четким объяснением того, что не работает, и приведите минимальный, полный и проверяемый пример . Прочитайте, как задать хороший вопрос . Обязательно возьмите тур и прочитайте это .
  • 0
    Я прошу прощения, обновлено. я ломал голову
Показать ещё 2 комментария
Теги:

1 ответ

0

Я построил упрощенный пример ваших таблиц в SQL Fiddle, а затем выполнил только выбор (показано ниже), чтобы увидеть, какие строки будут вставлены. Посмотрите, отвечает ли этот пример на ваш вопрос.

Обратите внимание, как в выбранном мной левом соединении дважды, один раз, чтобы получить список категорий, и снова, чтобы найти недостающие.

SQL Fiddle

MySQL 5.6 Настройка схемы:

CREATE TABLE IF NOT EXISTS 'code' (
    'id'            INT(11) UNSIGNED    NOT NULL    AUTO_INCREMENT,
    'name'          VARCHAR(50)         NULL        DEFAULT NULL,
    PRIMARY KEY ('id')
) 
    ENGINE=MyISAM 
    AUTO_INCREMENT=1 
    DEFAULT CHARSET=utf8 
    COLLATE=utf8_unicode_ci
    COMMENT '';

CREATE TABLE IF NOT EXISTS 'code_category' (
    'id'            INT(11) UNSIGNED    NOT NULL    AUTO_INCREMENT,
    'codeid'        INT(11) UNSIGNED    NULL        DEFAULT NULL,
    'categoryid'    INT(11) UNSIGNED    NULL        DEFAULT NULL,
    'discount'      INT(11) UNSIGNED    NULL        DEFAULT NULL,
    PRIMARY KEY ('id'),
    KEY 'idx_codecategory_catid' ('categoryid'),
    KEY 'idx_codecategory_codeid' ('codeid')
) 
    ENGINE=MyISAM 
    AUTO_INCREMENT=1 
    DEFAULT CHARSET=utf8 
    COLLATE=utf8_unicode_ci
    COMMENT '';

INSERT INTO 'code'
('id','name')
VALUES
(1,'code1'),
(2,'code2'),
(3,'code3'),
(4,'code4');

INSERT INTO 'code_category'
('codeid','categoryid','discount')
VALUES
(1,1,3),
(2,1,2),
(1,2,2),
(1,3,3),
(1,4,2),
(1,5,2),
(1,6,2),
(1,7,2),
(1,8,2),
(1,9,2),
(1,10,2),
(1,11,2),
(1,12,2),
(1,13,2),
(1,14,2),
(1,15,2),
(1,16,2),
(1,17,2),
(1,18,2),
(1,19,2),
(1,20,2);

Запрос 1:

SELECT 
        c.id,
        cc1.codeid,
        cc1.categoryid, 
        cc1.discount
    FROM code c
    LEFT JOIN code_category cc1
        ON cc1.codeid = 1
    LEFT JOIN code_category cc
        ON cc.codeid = c.id AND cc.codeid = cc1.codeid
    WHERE cc.codeid is null
  ORDER BY c.id,cc1.codeid,cc1.categoryid

Результаты:

| id | codeid | categoryid | discount |
|----|--------|------------|----------|
|  2 |      1 |          1 |        3 |
|  2 |      1 |          2 |        2 |
|  2 |      1 |          3 |        3 |
|  2 |      1 |          4 |        2 |
|  2 |      1 |          5 |        2 |
|  2 |      1 |          6 |        2 |
|  2 |      1 |          7 |        2 |
|  2 |      1 |          8 |        2 |
|  2 |      1 |          9 |        2 |
|  2 |      1 |         10 |        2 |
|  2 |      1 |         11 |        2 |
|  2 |      1 |         12 |        2 |
|  2 |      1 |         13 |        2 |
|  2 |      1 |         14 |        2 |
|  2 |      1 |         15 |        2 |
|  2 |      1 |         16 |        2 |
|  2 |      1 |         17 |        2 |
|  2 |      1 |         18 |        2 |
|  2 |      1 |         19 |        2 |
|  2 |      1 |         20 |        2 |
|  3 |      1 |          1 |        3 |
|  3 |      1 |          2 |        2 |
|  3 |      1 |          3 |        3 |
|  3 |      1 |          4 |        2 |
|  3 |      1 |          5 |        2 |
|  3 |      1 |          6 |        2 |
|  3 |      1 |          7 |        2 |
|  3 |      1 |          8 |        2 |
|  3 |      1 |          9 |        2 |
|  3 |      1 |         10 |        2 |
|  3 |      1 |         11 |        2 |
|  3 |      1 |         12 |        2 |
|  3 |      1 |         13 |        2 |
|  3 |      1 |         14 |        2 |
|  3 |      1 |         15 |        2 |
|  3 |      1 |         16 |        2 |
|  3 |      1 |         17 |        2 |
|  3 |      1 |         18 |        2 |
|  3 |      1 |         19 |        2 |
|  3 |      1 |         20 |        2 |
|  4 |      1 |          1 |        3 |
|  4 |      1 |          2 |        2 |
|  4 |      1 |          3 |        3 |
|  4 |      1 |          4 |        2 |
|  4 |      1 |          5 |        2 |
|  4 |      1 |          6 |        2 |
|  4 |      1 |          7 |        2 |
|  4 |      1 |          8 |        2 |
|  4 |      1 |          9 |        2 |
|  4 |      1 |         10 |        2 |
|  4 |      1 |         11 |        2 |
|  4 |      1 |         12 |        2 |
|  4 |      1 |         13 |        2 |
|  4 |      1 |         14 |        2 |
|  4 |      1 |         15 |        2 |
|  4 |      1 |         16 |        2 |
|  4 |      1 |         17 |        2 |
|  4 |      1 |         18 |        2 |
|  4 |      1 |         19 |        2 |
|  4 |      1 |         20 |        2 |
|----|--------|------------|----------|

Возможно, вам придется изменить имена столбцов в соответствии с вашими таблицами.

Ещё вопросы

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