MySQL join возвращает ноль, если таблица не содержит значения - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть три таблицы:

продукт

+----+-----------------------------------------------------+
| id | title                                               |
+----+-----------------------------------------------------+
|  1 | Lorem Ipsum is simply dummy text of the printing: 1 |
|  2 | Lorem Ipsum is simply dummy text of the printing: 2 |
|  3 | Lorem Ipsum is simply dummy text of the printing: 3 |
|  4 | Lorem Ipsum is simply dummy text of the printing: 4 |
|  5 | Lorem Ipsum is simply dummy text of the printing: 5 |
+----+-----------------------------------------------------+

валюта:

+----+-------+-------+
| id | alias | title |
+----+-------+-------+
|  1 | JPY   | JPY   |
|  2 | USD   | USD   |
|  3 | GBP   | GBP   |
+----+-------+-------+

PRODUCT_PRICE:

+------------+-------------+-------------+
| product_id | currency_id | price       |
+------------+-------------+-------------+
|          1 |           1 | 3600000.000 |
|          1 |           2 |     160.000 |
|          2 |           1 | 3260000.000 |
+------------+-------------+-------------+

Я хочу узнать цену специального продукта, это легко при использовании внутреннего соединения, если таблица product_price содержит цену продукта. Но я хочу получить результат, если таблица product_price не содержит цену товара.

Например: На сайте пользователь выбирает «JPY», поэтому я могу показать товар 1 с ценой 3600000.000. Но когда пользователь переключается на «GBP», он не может показать товар 1, потому что у него нет цены.

Я использую как левое соединение, левое внешнее соединение, так и перекрестное соединение, но я не могу получить правильный результат. Мой ожидаемый результат, когда пользователь выбирает «GBP» для продукта 1:

+----+-----------------------------------------------------+-------------+----------------+-------+
| id | title                                               | currency_id | currency_alias | price |
+----+-----------------------------------------------------+--------------------------------------|
|  1 | Lorem Ipsum is simply dummy text of the printing: 1 |           3 | GBP            | NULL  |
+----+-----------------------------------------------------+-------------+----------------+-------+

Пожалуйста, помогите мне, спасибо!

Ответы [ 2 ]

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

Хммм.Подумайте, вы просто хотите left join:

select p.*, c.alias, pp.price
from product p left join
     product_price pp
     on pp.product_id = p.id left join
     currency c
     on pp.currency_id = c.id and c.alias = 'JPY';

Это вернет все товары с их ценой в JPY, если таковые имеются.

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

Вам нужно будет сгенерировать все возможные комбинации между продуктами и валютами, используя CROSS JOIN.Затем вы можете использовать эти комбинации в качестве производной таблицы и сделать LEFT JOIN для таблицы соединений:

SELECT
  dt.*, pp.price
FROM 
(
  SELECT
    p.id AS product_id, 
    p.title AS product_tile, 
    c.id AS currency_id, 
    c.alias AS currency_alias, 
    c.title AS currency_title 
  FROM product AS p
  CROSS JOIN currency AS c
) AS dt 
LEFT JOIN product_price AS pp 
  ON pp.product_id = dt.product_id AND 
     pp.currency_id = dt.currency_id 
WHERE dt.currency_title = 'GBP'  -- You can provide currency filter here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...