2014-03-06 48 views
1

我有两个表,comp_productcomp_product_marchandSQL外部连接2个表

comp_product包含产品信息(描述,名称等)

comp_product_marchand包含不同的价格(产品经销商)。每个经销商都有一个产品的价格。但是,并非所有产品

我想只有一个SQL查询(即使经销商没有一个),以获得每个经销商的产品清单和他的价格

我有这样的SQL查询:

SELECT 
    p.id_product, 
    pm.price 
FROM comp_product_marchand pm 
LEFT OUTER JOIN comp_product p 
    ON p.id_product = pm.id_product 
WHERE id_marchand = 4 

(WHERE子句是演示只)

该SQL查询返回其中有一个价格,而不是其他产品的价格... 任何想法?

+0

能否请您发表小提琴 – Rohan

+0

HTTP:/ /img15.hostingpics.net/pics/936101Sanstitre.png –

回答

5

更改链接表之间:

SELECT 
    p.id_product, 
    pm.price 
FROM comp_product p 
LEFT OUTER JOIN comp_product_marchand pm 
    ON p.id_product = pm.id_product 
    AND id_marchand = 4 

这样,你会告诉所有的产品,如果马尔尚= 4有​​一个关于马尔尚的信息将被显示。

我把马尔尚ID查询的ON子句中,因为如果你把它在WHERE子句中,你会削减在马尔尚没有该产品

+0

它的工作原理!谢谢 ! –

+0

@FabienPapet:祝你有美好的一天;) –

+0

+1:这个回答也颠倒了从'价格左连接产品'(如OP的帖子)到'产品左连接价格'的查询顺序,从而确保所有产品总是包含在JOIN的结果中。 – MatBailie

3

所有行你需要改变连接的工作方式。您可以使用您当前的查询并使用RIGHT连接,或者我更喜欢的方式是切换表格的顺序(仍然使用LEFT连接),所以希望查看所有结果的表位于连接的左侧加入。有时候,一个难以理解的概念,但是这个图可以帮助

enter image description here

代码转换连接: 选择 p.id_product, pm.price

FROM comp_product p 
       LEFT OUTER JOIN comp_product_marchand pm ON 
           p.id_product=pm.id_product 
           AND id_marchand=4 ; 
+0

你不能把WHERE子句id_marchand = 4,因为当comp_product_marchand不存在以这种方式你削减那些行 –

+0

我认为这只是为该商家过滤?所以他的查询只返回一次商家的价格和产品。 –

+0

感谢您的帮助,您的图表会帮助我很多! ;) –