Выберите запись из 3 таблиц, используя внутреннее и внешнее соединение в mysql

Я хочу выбрать записи product_id product_name actual_price discount_price из oc_product, oc_product_description, oc_product_special. Таблица oc_product_special содержит цену товара со скидкой, но на некоторые товары скидки нет, т.е. Discount_price=0.0000. Я хочу выбрать все 40 продуктов с их Discount_price и если Discount_price = 0,0000, то напечатать NULL в этой строке.

Запрос, который я пробовал:

SELECT oc_product_description.product_id,oc_product_description.name product_name, oc_product.price actual_price, oc_product_special.price discount_price 
FROM oc_product 
INNER JOIN oc_product_description 
RIGHT OUTER JOIN oc_product_special ON oc_product_description.product_id = oc_product.product_id = oc_product_special.product_id`

он возвращает мне неправильный вывод, например

product_id  product_name    actual_price    discount_price
  NULL            NULL             NULL            0.0000
  NULL            NULL             NULL            0.0000
  NULL            NULL             NULL            0.0000
  NULL            NULL             NULL            0.0000
  NULL            NULL             NULL            0.0000
  NULL            NULL             NULL            0.0000
  NULL            NULL             NULL            1950.0000
  NULL            NULL             NULL            3850.0000
  NULL            NULL             NULL            7500.0000

И я ожидаю этот вывод:

product_id  product_name    actual_price    discount_price
  1               yyyy             1000.0000      0.0000
  2               xxxx             2000.0000      500.0000

person Vilas    schedule 10.08.2015    source источник
comment
Предоставьте образец набора данных для ваших таблиц   -  person M Khalid Junaid    schedule 10.08.2015
comment
Покажите ддл пожалуйста.   -  person Jens    schedule 10.08.2015
comment
Вы говорите о 0,000, вы хотите NULL в этой строке, но желаемый результат показывает 0,000. Это опечатка, или я неправильно прочитал вопрос?   -  person Joachim Isaksson    schedule 10.08.2015
comment
Обратите внимание, что использование RIGHT JOIN исчезающе редко. Для каждого RIGHT JOIN существует (теоретически) функционально идентичный LEFT JOIN, и тот, который большинству людей (включая меня) покажется более интуитивным. Я говорю «теоретически» только потому, что очень редко в более сложных запросах может быть трудно понять, что такое эквивалентное LEFT JOIN!   -  person Strawberry    schedule 10.08.2015


Ответы (1)


Несколько вещей;

Условием соединения между oc_product и oc_product_description должно быть внутреннее соединение между ними, а не внешнее соединение с третьей таблицей;

INNER JOIN oc_product_description 
  ON oc_product.product_id = oc_product_description.product_id

В этом случае условие вашего внешнего соединения должно содержать только условие этой таблицы;

RIGHT OUTER JOIN oc_product_special 
  ON oc_product.product_id = oc_product_special.product_id

Кроме того, поскольку вы, вероятно, всегда хотите, чтобы описание предмета всегда было там, а специальная цена была необязательной, вам, вероятно, следует использовать LEFT JOIN вместо RIGHT JOIN;

Это приведет к окончательному запросу, подобному;

SELECT oc_product_description.product_id,oc_product_description.name product_name, 
       oc_product.price actual_price, oc_product_special.price discount_price 
FROM oc_product 
INNER JOIN oc_product_description 
  ON oc_product.product_id = oc_product_description.product_id
LEFT OUTER JOIN oc_product_special 
  ON oc_product.product_id = oc_product_special.product_id
person Joachim Isaksson    schedule 10.08.2015
comment
В качестве примечания, oc_product_description.product_id = oc_product.product_id = oc_product_special.product_id не проверяет, что все 3 значения одинаковы, для этого вам понадобится что-то вроде oc_product_description.product_id = oc_product.product_id AND oc_product_special.product_id = oc_product_description.product_id - person Joachim Isaksson; 10.08.2015