如何在PHP中运行三个表INNER JOIN?

时间:2015-11-05 10:46:37

标签: php inner-join

我需要根据producttags表和subcategorytags表查询几个表中的“product tags”。

然后生产标签为“衬衫”的产品。

如果我删除了第一个内连接和“WHERE t.producttag = 'shirt'”,它就可以了。对于子类别标记部分也是如此。

但是当我尝试两者时,它不会出错,但不会产生任何效果。

SELECT p.datebackinstock, p.datepricedrop, p.id, p.catid, p.subid, p.catname, p.subname, 
       p.title, p.price, p.photoprimary, p.comingsoon, p.rcstock, p.preorder, 
       p.bundleroman1, p.bundleroman2, p.bundleroman3, p.bundleroman4, p.bundleroman5, 
       p.pricedrop  FROM products AS p 

INNER JOIN producttags AS t ON p.id = t.prodid

INNER JOIN subcategorytags AS s ON p.subid = s.subid 

WHERE t.producttag = 'shirt' OR s.tag = 'shirt'

2 个答案:

答案 0 :(得分:1)

您必须使用左连接,因为您不知道是否设置了标签。在您的查询中,只有找到producttag a subcategorytag时才会返回该行。即使没有找到另一个表中的行,左连接也将返回该行。因此,您还需要进行额外检查以确保值不为空。

SELECT p.datebackinstock, p.datepricedrop, p.id, p.catid, p.subid, p.catname, p.subname, 
       p.title, p.price, p.photoprimary, p.comingsoon, p.rcstock, p.preorder, 
       p.bundleroman1, p.bundleroman2, p.bundleroman3, p.bundleroman4, p.bundleroman5, 
       p.pricedrop  FROM products AS p 

LEFT JOIN producttags AS t ON p.id = t.prodid

LEFT JOIN subcategorytags AS s ON p.subid = s.subid 

WHERE (t.producttag NOT NULL AND t.producttag = 'shirt') OR (s.tag NOT NULL AND s.tag = 'shirt')

有关左右联接的详细信息,请参阅mysql docs

答案 1 :(得分:0)

我会使用left outer join或者更确切地说,我会尝试,我想:

select
    p.`datebackinstock`, 
    p.`datepricedrop`, 
    p.`id`, 
    p.`catid`, 
    p.`subid`, 
    p.`catname`, 
    p.`subname`, 
    p.`title`, 
    p.`price`, 
    p.`photoprimary`, 
    p.`comingsoon`, 
    p.`rcstock`, 
    p.`preorder`, 
    p.`bundleroman1`, 
    p.`bundleroman2`, 
    p.`bundleroman3`, 
    p.`bundleroman4`, 
    p.`bundleroman5`, 
    p.`pricedrop` 
    from `products` p 
    left outer join `producttags` t on p.`id` = t.`prodid`
    left outer join `subcategorytags` s on p.`subid` = s.`subid`
    where t.`producttag` = 'shirt' or s.`tag` = 'shirt'