2014-06-24 5 views
0

В настоящее время у меня около 1000 продуктов в таблице MySQL, каждая из которых, по-видимому, дублируется (1 с продуктом SKU и один с продуктом MPN или номером продукта производителя), как показано ниже:Разделенные столбцы в mySQL

+--------------+------------+----------------+-----------------+------------------------+ 
| V_Article_ID | Article_ID | V_Article_Code | Brand_Domain_ID | Prefered_V_Article_ID | 
+--------------+------------+----------------+-----------------+------------------------+ 
|  11003 |  7043 | AA4011   | null   | 11002     | 
|  11002 |  7043 | U-30G-BK  | 101036   | null     | 
+--------------+------------+----------------+-----------------+------------------------+ 

в идеале, что я хотел бы, чтобы объединить две строки в одну строку для каждого продукта (как вы можете увидеть article_id одинакова для обоих рядов), держать Brand_Domain_ID, которое NOT NULL и разделить два отдельных Vendor_Article_Code - в две отдельные колонки; SKU (AA4011) и MPN (U-30G-BK), поэтому вывод будет выглядеть примерно так:

+------------+--------+----------+-----------------+ 
| Article_ID | SKU | MPN | Brand_Domain_ID | 
+------------+--------+----------+-----------------+ 
|  7043 | AA4011 | U-30G-BK |   101036 | 
+------------+--------+----------+-----------------+ 

Я в настоящее время используется следующее заявление для достижения того, что я хочу (если только для одного продукта на основе на article_id):

SELECT article_id, 
    case WHEN v_article_code REGEXP '^AA' THEN v_article_code END as SKU, 
    case WHEN v_article_code NOT REGEXP '^AA' THEN v_article_code END as MPN, 
    Brand_Domain_ID 
FROM vendor_article 
WHERE article_id = 7043 

+------------+--------+----------+-----------------+ 
| Article_ID | SKU | MPN | Brand_Domain_ID | 
+------------+--------+----------+-----------------+ 
|  7043 | null | U-30G-BK |   null | 
+------------+--------+----------+-----------------+ 
|  7043 | AA4011 | null |   101036 | 
+------------+--------+----------+-----------------+ 

Мой вопрос заключается в следующем: есть ли способ, чтобы сократить это вниз, так что оба строк стали одной строкой, без нулевых элементов и того же article_id? Кроме того, есть ли быстрый способ, с помощью которого можно проходить через каждый из Article_ID, например, цикл for в PHP? Я знаю, как вставлять вывод в новую таблицу, я просто не уверен, как лучше подойти к решению.

Любая помощь была бы очень признательна.

ответ

1

Еще одна реализация:

select a.article_id, a.v_article_code MKU, b.v_article_code MPN, 
    ifnull(a.brand_domain_id, b.brand_domain_id) brand_domain_id, 
    ifnull(c.channel_sku, d.channel_sku) channel_sku 
from vendor_article a 
join vendor_article b on a.article_id = b.article_id 
    and a.brand_domain_id is not null and b.prefered_v_article_id is not null 
left join vendor_article_channel c on a.v_article_id = c.vendor_article_id 
left join vendor_article_channel d on b.v_article_id = d.vendor_article_id; 

fiddle

+0

Привет, спасибо за ваш ответ, я пошел с этим решением в конце. Мне было интересно, как выбрать столбец из другой таблицы (имя таблицы «vendor_article_channel.CHANNEL SKU»), где vendor_article_channel.VENDOR_ARTICLE_ID равно vendor_article.VENDOR_ARTICLE_ID. Я попытался добавить это к операторам select/from, но он продолжает говорить, что a.article_id больше не существует? Я читал все это сегодня, и я просто наклоняю голову вокруг него? Еще раз спасибо за ваш ответ! –

+0

@SteveVincent, может быть, вы хотите 'a.v_article_id = c.vendor_article_id', поскольку в вашей статье нет' vendor_article_id' в таблице 'vendor_article'? – Fabricator

+0

жаль, что я сократил vendor_article_id до v_articled_id, чтобы он соответствовал таблице, в DB его vendor_article_id –

1

Вам нужно соединить таблицу к себе, например, так:

select sku.article_id as Article_Id, 
    sku.v_article_code as SKU, 
    mpn.v_article_code as MPN, 
    coalesce(sku.brand_domain_id,mpn.brand_domain_id) as Brand_Domain_Id 
from vender_article sku join vender_article mpn 
    on sku.article_id = mpn.article_id 
where sku.v_article_code like 'AA%' 
    and mpn.v_article_code not like 'AA%'; 

редактировать: Если бы v_article_id, где я должен был v_article_code.

+0

Спасибо за ваш ответ, я должен был бы сделать это яснее, но есть только одна таблица (vendor_article) - Есть ли префиксы SKU./mpn. к эффекту имени столбца, как MySQL относится к этой таблице? Кроме того, мне нужно предложение WHERE, чтобы найти article_id, могу ли я просто добавить это в конец? –

+0

Вы должны дать ему прогон, вы можете проверить мой синтаксис (я признаю, что я использую Oracle больше, чем MySQL), и я думаю, что результаты помогут вам это понять. Но вкратце - это «самостоятельное присоединение»: 'vender_article sku join vender_article mpn'. Он создает две «копии» таблицы (называемые sku и mpn, так что вы можете различать их). Здесь мы выбираем определенные типы строк из одной копии и другие типы строк из другой копии и объединяем их вместе. Мой пример также решает ваше «идеальное» решение, объединяя все ваши ряды обломок, но для определенного идентификатора да, вы можете просто добавить это к концу. – user3067860

+0

Я пробовал, но он, казалось, выбрасывал много случайных чисел здесь и там, что очень странно. Однако после прочтения вашего ответа и поиска в нем я узнал много больше, так что спасибо! –

Смежные вопросы