我需要链接一些联接查询,而我无法得到我想要的结果 我有很多表来保存一些产品信息:
- 产品:多种语言的名称和描述。
-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 目前,通过此查询,我得到的所有内容都是提供商的产品,其中包含产品< - >位置(通过products_location表)之间的关系。
任何方法都可以吗??
谢谢。
修改
关于我想要获得的内容的一个例子可能是这样的:
表:公司
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
如果我只在products_locations表中使用LEFT JOIN,我没有得到最后两行,如果我对所有表使用LEFT JOIN,我会得到重复的产品引用,我也得到其他提供商提供的产品(在示例1-> SomeName)中。
答案 0 :(得分:1)
LEFT JOIN
和products
表格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