вставить в таблицу выбрать из таблицы, где columnname = xxx и columnname2 = yyy слишком много циклов - PullRequest
0 голосов
/ 15 ноября 2018

Я постараюсь быть максимально полным, но кратким, если это необходимо. Если я что-то пропущу, пожалуйста, дайте мне знать.

У меня есть набор действий, и каждое действие состоит из шагов, необходимых для выполнения данного действия. Каждый шаг имеет несколько дополнительных компонентов, которые идут вместе с ним. Если бы вы смотрели на это как на дерево, это выглядело бы так:

ACTIVITY -- STEP ---- COMPONENT

Ниже приведены результаты набора данных таблицы компонентов.

enter image description here

Я хочу написать оператор вставки / выбора mySQL, который позволит мне скопировать ID = 84. Однако при вставке значение идентификатора должно наследовать новый идентификатор ACTIVITY (например, давайте перейдем к 299), а AID должен наследовать значение идентификатора STEP (например, для этого давайте перейдем к 501 502 503 504 505 506) .

Я знаю, как будет выглядеть оператор mySQL, это не проблема. Проблема, с которой я сталкиваюсь, заключается в том, как написать цикл, чтобы я мог передать новый идентификатор и новые значения AID. SID - это первичный ключ (автоинкремент).

С указанным выше набором данных я ожидаю, что будут вставлены 6 новых записей. Вместо этого я получаю 9, так что мои циклы не зацикливаются правильно, или я передаю неверные данные.

Вот цикл:

for (local.data.newAID in local.data.list_newAID){
    //  COPY SET
    for (local.data.origAID in local.data.list_existingAID){
        local.formDataStruct.origAID = local.data.origAID;
        variables.workoutDAO.makeCopyCoreSet(
            origID = local.dataStruct.ID,
            newID = local.dataStruct.newID,
            origAID = local.dataStruct.origAID,
            newAID = local.dataStruct.newAID
        );
    }
}

Вот функция makeCopyCoreSet:

INSERT INTO SET(ID, LID, AID)
SELECT
    :newID, LID, :newAID
FROM
    Set
WHERE ID = :origID AND AID = :origAID;

Чего мне не хватает?

1 Ответ

0 голосов
/ 16 ноября 2018

Мы хотим скопировать одно из наших действий, поэтому мы хотим передать идентификатор, который мы хотим скопировать, и идентификатор, которым мы хотим быть новым идентификатором (если у нас нет другого способа определить его.

variables.workoutDAO.NEW_makeCopyCoreSet(
            origID = local.dataStruct.ID,
            newID = local.dataStruct.newID
        );

И затем в нашей функции NEW_makeCopyCoreSet() (функция CF) у нас есть запрос:

INSERT INTO component (ID, LID, AID)
SELECT DISTINCT :newID, LID, AID 
FROM component
WHERE ID = :origID

Чтобы увидеть это в действии (со стороны SQL):

https://dbfiddle.uk/?rdbms=mariadb_10.2&fiddle=ba4328dca3327814a7dc18fea284ead8

Сначала мы настроим наши базовые данные.

/* SETUP 1 */
CREATE TABLE component ( ID int, LID int, AID int, SID int UNIQUE AUTO_INCREMENT)

/* SETUP 2 */
INSERT INTO component (ID, LID, AID)
SELECT 84,0,432 UNION ALL
SELECT 84,0,433 UNION ALL
SELECT 84,0,434 UNION ALL
SELECT 84,0,435 UNION ALL
SELECT 84,0,435 UNION ALL
SELECT 84,0,435 UNION ALL
SELECT 84,0,435 UNION ALL
SELECT 84,0,436 UNION ALL
SELECT 84,0,437

/* What's in the original? */
SELECT * FROM component
ID | LID | AID | SID
-: | --: | --: | --:
84 |   0 | 432 |   1
84 |   0 | 433 |   2
84 |   0 | 434 |   3
84 |   0 | 435 |   4
84 |   0 | 435 |   5
84 |   0 | 435 |   6
84 |   0 | 435 |   7
84 |   0 | 436 |   8
84 |   0 | 437 |   9

Затем мы копируем существующий идентификатор в новый идентификатор.

/* Copy an ID. */
INSERT INTO component (ID, LID, AID)
SELECT DISTINCT 299, LID, AID 
FROM component
WHERE ID = 84

/* What's in the table for the new ID? */
SELECT * FROM component WHERE ID = 299
 ID | LID | AID | SID
--: | --: | --: | --:
299 |   0 | 432 |  16
299 |   0 | 433 |  17
299 |   0 | 434 |  18
299 |   0 | 435 |  19
299 |   0 | 436 |  20
299 |   0 | 437 |  21
...