У меня есть необходимость связать некоторые запросы на объединение, и я не могу получить результат, который я хочу.
У меня есть много столов, чтобы сэкономить некоторую информацию о продукте: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).
Вопрос не ясен. Попробуйте перефразировать и дать примеры того, что вы получаете сейчас в результате, и того, что вы хотели бы получить. – evilpenguin
Чтобы дать нам шанс на бой, я переформатировал запрос и немного почистил его. – Strawberry
'Любой способ сделать это?' Как насчет того, что вы сказали себе в своем названии? Измените 'JOIN' на' LEFT JOIN'. Потому что 'INNER' является значением по умолчанию и не будет возвращать строки с' NULL ', которые не совпадают в другой таблице. –