关于mysql

时间:2016-08-08 11:32:55

标签: mysql left-join inner-join

我需要链接一些联接查询,而我无法得到我想要的结果 我有很多表来保存一些产品信息:

- 产品:多种语言的名称和描述。

-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)中。

1 个答案:

答案 0 :(得分: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