2016-08-08 2 views
1

У меня есть необходимость связать некоторые запросы на объединение, и я не могу получить результат, который я хочу.
У меня есть много столов, чтобы сэкономить некоторую информацию о продукте:INNER и LEFT JOIN on mysql

-Продукция: название и описание на многих языках.

-Products_attributes: Некоторые общие атрибуты таких продуктов, как поставщик или покупательная цена.

-Products_locations: Информация о местах, где продается определенный продукт, например, акции или продажная цена.

-Другой важный стол - это компании: некоторые из этих компаний могут быть провайдером.

Ну, это мой запрос:

SELECT p.id 
    , p.name nameProduct 
    , p.reference refProduct 
    , a.buy_price priceProduct 
    , l.active 
    , l.sell_price 
    , l.stock stockProduct 
    , c.title p_name 
    FROM products p 
    LEFT JOIN products_location l 
    ON l.product_reference = p.reference 
    AND l.active = 1 
    AND l.location_id = 4 
    JOIN products_attributes a 
    ON a.product_reference = p.reference 
    AND p.lang = 'es' 
    AND a.provider = 6 
    JOIN companies c 
    ON a.provider = c.id 
    AND c.id = 6 

То, что я хочу сделать, это получить все продукты определенного поставщика, если место, откуда выполняется запрос имеет этот продукт, строка результата должен также возвращаться к этому вопросу < ->, в противном случае он должен вернуть NULL в столбце, относящемся к этому отношению.
На данный момент, с этим запросом, все, что я получаю, является продуктом поставщика, у которого есть связь между продуктом < -> местоположение (через таблицу продуктов_оценок).

Любой способ сделать это ??

спасибо.

EDIT

пример о том, что я пытаюсь получить может быть что-то вроде этого:

ТАБЛИЦА: Компании

id | Title 
1 | SomeName 
6 | ProviderName 

ТАБЛИЦА: Продукты

id | reference | name | lang 
1 | 11111  | 1_es | es 
2 | 11111  | 1_en | en 
3 | 22222  | 2nam | es 
4 | 33333  | 3nam | es 
5 | 44444  | 4nam | es 
6 | 55555  | 5nam | es 

ТАБЛИЦА : Products_atributte

id | product_reference | buy_price | provider 
1 | 11111    | 10  | 6 
1 | 22222    | 15  | 6 
1 | 33333    | 20  | 6 
1 | 44444    | 12  | 1 
1 | 55555    | 13  | 1 

ТАБЛИЦА: Products_locations

id | product_reference | location_id | sell_price | stock | active 
1 | 11111    | 4   | 26   | 10 | 1 
1 | 11111    | 5   | 25   | 13 | 1 
1 | 22222    | 5   | 20   | 13 | 1 
1 | 44444    | 5   | 21   | 1 | 1 
1 | 55555    | 5   | 22   | 2 | 1 

И результат должен быть примерно так:

nameProduct | refProduct | priceProduct | active | sell_price | stockProduct | p_name 
1_es  | 11111  | 10   | 1  | 26   | 10   | ProviderName 
2nam  | 22222  | 15   | NULL | NULL  | NULL   | ProviderName 
3nam  | 33333  | 20   | NULL | NULL  | NULL   | ProviderName 

Если я использую LEFT JOIN только в таблице products_locations, Я не получить две последние строки, и если я использую LEFT JOIN со всеми таблицами, я получаю дубликаты ссылок на продукты, также получаю продукты, предоставляемые другими поставщиками (в примере 1-> SomeName).

+0

Вопрос не ясен. Попробуйте перефразировать и дать примеры того, что вы получаете сейчас в результате, и того, что вы хотели бы получить. – evilpenguin

+0

Чтобы дать нам шанс на бой, я переформатировал запрос и немного почистил его. – Strawberry

+0

'Любой способ сделать это?' Как насчет того, что вы сказали себе в своем названии? Измените 'JOIN' на' LEFT JOIN'. Потому что 'INNER' является значением по умолчанию и не будет возвращать строки с' NULL ', которые не совпадают в другой таблице. –

ответ

1

Вы были верны LEFT JOINproducts и products_location таблиц. Однако вы использовали INNER JOIN для двух других таблиц в запросе, и я считаю, что это может быть причиной того, что вы видите только записи, которые имеют отношение между продуктом и местоположением. Логика заключалась бы в том, что у продукта, у которого нет местоположения , также не имеет записи, например, в таблице products_attributes.Следовательно, несоответствующие записи, которые вы хотите сохранить, будут отфильтрованы вниз по потоку INNER JOIN. Чтобы исправить это, используйте LEFT JOIN везде:

SELECT products.id, 
     products.name AS nameProduct, 
     products.reference AS refProduct, 
     products_attributesbuy_price AS priceProduct, 
     products_location.active, 
     products_location.sell_price, 
     products_location.stock AS stockProduct, 
     provider.title AS p_name 
FROM products 
LEFT JOIN products_location 
    ON products_location.product_reference = products.reference AND 
     products_location.active = 1 AND 
     products_location.location_id = 4 
LEFT JOIN products_attributes 
    ON products_attributes.product_reference = products.reference AND 
     products.lang = 'es' AND 
     products_attributes.provider = 6 
LEFT JOIN companies AS provider 
    ON products_attributes.provider = provider.id AND 
     provider.id = 6 
+0

Привет @TimBiegeleisen есть проблема с использованием LEFT JOIN со всеми таблицами ... Я получаю дублированные результаты, и я получаю также продукты, которые не предоставляются службой, которую я ищу. Спасибо. –