Проблема с логикой для MySQL Query для вставки в контент из одной таблицы в другую - PullRequest
1 голос
/ 15 сентября 2011

Интересно, кто-нибудь может помочь?Таблица_A ниже показывает пример продукта в моей базе данных продуктов MySQL.У меня проблемы с разработкой логики запроса для достижения таблицы ниже.(У меня проблема с командой INSERT.)

Table_A

 entry_id | SKU  | Product          | Parent_SKU  | IsVariant
----------------------------------------------------------------
     1    | ABC  | Green T-Shirt    |             | No
     2    | ABCS | Green T-Shirt S  | ABC         | Yes
     3    | ABCM | Green T-Shirt M  | ABC         | Yes
     4    | ABCL | Green T-Shirt L  | ABC         | Yes

Table_B

 child entry_id | parent entry_id
----------------------------------
        2       |       1
        3       |       1
        4       |       1

Пока что вот запрос, который я выполняю.

INSERT INTO Table_B
(parent_entry_id, child_entry_id)

    SELECT
        Table_A.entry_id,
        (SELECT Table_A.entry_id FROM Table_A
         WHERE Table_A.SKU = Table_A.Parent_SKU
         AND Table_A.IsVariant = 'No')
    FROM Table_A
    WHERE IsVariant = 'Yes'

Я прекрасно знаю, что логика ошибочна, но после дня попыток обдумать ее в моем мозгу измотаны.Я искал здесь и в других местах настолько хорошо, насколько я могу думать, но без каких-либо мыслей или ответов, чтобы помочь.Так может кто-нибудь здесь помочь?Должен ли я думать об этом по-другому?

Ответы [ 2 ]

0 голосов
/ 15 сентября 2011

Если вам нужен только один уровень родительско-дочерних отношений (без внуков, внучат и т. Д.) тогда вы можете просто сделать самостоятельное соединение:

SELECT T.entry_id as child_id, T2.entry_id as parent_id

FROM TableA AS T LEFT JOIN TableA AS T2 

ON T.parent_SKU=T2.SKU

Если вы хотите пройти по всему родительско-дочернему дереву, Oracle и MSSQL имеют механизмы, которые позволяют вам это делать. Я не знаком с такой опцией для MySQL.

Там больше информации здесь: http://ftp.ntu.edu.tw/MySQL/tech-resources/articles/hierarchical-data.html /55374/mozhno-li-sdelat-rekursivnyi-zapros-sql

Edit: Хорошо, сначала немного санации данных: я не знаю, является ли это артефактом моего процесса импорта, или он такой же в вашем конце, но в полях parent_sku была добавлена ​​новая строка. Естественно, это привело к ошибке при попытке сопоставить ABC parent_sku ребенка с ABC \ n SKU родителей. Проверьте это с помощью select * from TableA where parent_sku like '%\n'. Если какие-либо столбцы совпадают, запустите SET SQL_SAFE_UPDATES = 0;

ОБНОВЛЕНИЕ TableA SET parent_sku = ЗАМЕНА (ЗАМЕНА (parent_sku, '\ r', ''), '\ n', ''); Это удалит новые строки. То же самое относится и к пустой строке parent_sku's - если они не равны null на вашем конце, сделайте их нулевыми. Вот пересмотренный запрос - я добавил некоторую фильтрацию перед объединением, и теперь она работает быстрее. Просто дважды проверьте ваши \ n и NULL, и это должно привести к правильному выводу:

SELECT child.entry_id as child_id, parent.entry_id as parent_id

FROM 

    (

        select * from TableA 

                -- only children have parent_sku
        where parent_SKU is not null

               -- some extra safety for empty strings, 
                -- can be removed after empties are replaced by NULLs
        and length(parent_SKU) > 0 and length(sku)>0 and length(parent_sku)>0

    )

        AS child 

LEFT JOIN 

    (

        select * from tableA 
                -- only parents don't have parent_sku
        where (parent_SKU is null or length(parent_SKU)=0) 

        and length(sku)>0

    ) AS parent



ON child.parent_SKU = parent.SKU

Результаты

0 голосов
/ 15 сентября 2011

Может быть, я что-то здесь упускаю, но

select child.entry_id, parent.entry_id 
from Table_A child
join Table_A parent
on (child.parent_sku = parent.sku)
where child.isVariant = 'Yes'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...