2014-08-27 3 views
0

У меня есть таблица с некоторым каталогом продуктов. В таблице есть главный магазин, в котором указаны цены на все продукты. Например, для основного магазина IDShop - 9999, а одним продуктом может быть Red Card = $ 10 с оригиналом OriginIDProduct = 101.SELECT уникальная Информация о продукте по Каталогу в MySQL

IDShop=9999 
Price=10 
OriginIDProduct=101 

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

ПРЕДПОЛАГАЛОСЬ, например, эти данные:

IDShop=1 
Price=12 
OriginIDProduct=101 

И в той же таблице, помните, ...

Мне нужно ВЫБРАТЬ изделия, как из магазина 9999, но если есть продукт с магазином 1, не возвращайте информацию для этого продукта sho р 9999.

В этом случае для этого продукта SELECT, возвращает запись

IDShop=1 
Price=12 
OriginIDProduct=101 

Любая идея?

ответ

0
select 
    IDShop, Price, OriginIDProduct 
from 
    table 
where 
    IDShop <> 9999 
    or 
    ( 
     IDShop = 9999 
     and not exists (select IDShop from table where IDShop <> 9999) 
    ) 
+0

Это решение не решает проблему. Это возвращает только продукты для IDShop <> 9999. Но нужно возвращать продукты IDShop = 9999 с замененными записями IDShop = 1 для тех же продуктов. Пример IDProduct = 1 (информация магазина 9999), IDProduct = 2 (существует в 9999 и 1. Запись 1 заменяет 9999, IDProduct = 3 (информация 99999. Помните, что 9999 является основным –

+0

@ OscarFernándezArc's Извините, пока не поняли вашу потребность. Во всяком случае, это неправда, что мой запрос возвращает только те продукты, где IDShop <> 9999. Взгляните на условие «ИЛИ». –

+0

Жаль, но ваше решение возвращено: 'IDSHOP \t ЦЕНА \t ORIGINIDPRODUCT '' 101' '1 \t \t 50 103' с SQL образец Barmar (http://sqlfiddle.com/#!2/ca86b6/1) Правильное возвращение: 'IDSHOP \t \t ЦЕНА ORIGINIDPRODUCT' ' 1 101' '9999 \t \t 14 102' ' 1 \t \t 50 103' И если клиент добавить новый продукт без связи главного магазина необходимо вернуть: 'IDSHOP \t \t ЦЕНА ORIGINIDPRODUCT' ' 1 101' '9999 102' ' \t 50 103' ' 1 \t \t 33 0' Привет, Оскар. –

1

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

SELECT IFNULL(t2.IDShop, t1.IDShop) AS IDShop, 
     IFNULL(t2.Price, t1.Price) AS Price, 
     IFNULL(t2.OriginIDProduct, t1.OriginIDProduct) AS OriginIDProduct 
FROM table AS t1 
LEFT JOIN table AS t2 ON t1.OriginIDProduct = t2.OriginIDProduct AND t2.IDShop = 1 
WHERE t1.IDShop = 9999 

http://sqlfiddle.com/#!2/ca86b6/1

+0

Это решение работает, но может существовать новый продукт, который не соответствует основному магазину. Например, клиент добавляет новые продукты в магазин Main, который нравится продавать. Например, отношение к образцу ссылки - новый продукт, такой как VALUES (1, 33, 100001). Любая идея вернуть этот продукт в этот выбор –

+0

за то, что вам нужен «ПОЛНЫЙ ВЗАИМОДЕЙСТВУЙТЕ», но MySQL его не поддерживает. Если вы выполните поиск SO, вы найдете обходные пути. Для любого компетентного программиста должно быть легко изменить мой ответ, чтобы включить его. – Barmar

+0

Спасибо, Barmar, я нашел решение с использованием UNION ALL и OriginIDProduct = 0. Потому что все продукты нового клиента не соответствуют основному магазину. Я публикую ответ. Спасибо, Оскар. –

0

Наконец с помощью Бармой нашли это:

SELECT IFNULL(t2.IDShop, t1.IDShop) AS IDShop, 
     IFNULL(t2.Price, t1.Price) AS Price, 
     IFNULL(t2.OriginIDProduct, t1.OriginIDProduct) AS OriginIDProduct 
FROM table AS t1 
LEFT JOIN table AS t2 ON t1.OriginIDProduct = t2.OriginIDProduct AND t2.IDShop = 1 
WHERE t1.IDShop = 9999 
UNION ALL 
SELECT IDShop, Price, OriginIDProduct FROM table WHERE IDShop=1 AND OriginIDProduct=0 

Спасибо всем. С уважением, Оскар.

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