左连接带有子查询的三个表

时间:2012-10-03 08:27:44

标签: mysql subquery left-join multiple-tables

Check this fiddle for DB and tables

SELECT p.*
FROM Products p
LEFT JOIN offertran ot 
ON p.prod_id = ot.prod_id
LEFT JOIN Offers o
ON ot.offer_id =  (SELECT id FROM Offers 
                   Where dF<=3 AND dt>=3)

ORDER BY o.id DESC, 
          p.prod_id ASC
LIMIT 20

输出是:

| PROD_ID | CATEGORY_ID | PROD_NAME |  BRAND | PRICE | STATUS |
---------------------------------------------------------------
|      p3 |          c1 |     prod3 | brand3 |  3000 | active |
|      p3 |          c1 |     prod3 | brand3 |  3000 | active |
|      p1 |          c1 |     prod1 | brand1 |  1000 | active |
|      p2 |          c2 |     prod2 | brand2 |  2000 | active |
|      p4 |          c2 |     prod4 | brand1 |  4000 | active |
|      p5 |          c1 |     prod5 | brand2 |  5000 | active |
|      p6 |          c2 |     prod6 | brand3 |  6000 | active |

但是,在这里您可以看到p3两次显示。我不知道为什么.. 我已经尝试了所有可能的方法,但我找不到任何补救措施.. :(

4 个答案:

答案 0 :(得分:4)

中的问题
LEFT JOIN Offers o
ON ot.offer_id =  (SELECT id FROM Offers 
                   Where dF<=3 AND dt>=3)

您使用常量值加入ot.offer_id(没有任何意义可以从商品表中选择它们。)

正确的方法:

SELECT p.*
FROM Products p
LEFT JOIN offertran ot 
ON p.prod_id = ot.prod_id
LEFT JOIN Offers o
ON ot.offer_id = o.id AND o.dF<=3 AND o.dt>=3
ORDER BY o.id DESC, 
          p.prod_id ASC
LIMIT 20

查看this SQLFiddle

答案 1 :(得分:1)

可能缺少'o'和'ot'之间的连接条件:

SELECT p.*
FROM Products p
LEFT JOIN offertran ot 
ON p.prod_id = ot.prod_id
LEFT JOIN Offers o
ON ot.offer_id IN(SELECT id FROM Offers 
               Where dF<=3 AND dt>=3)
**AND ot.offer_id = o.id***
ORDER BY o.id DESC, 
      p.prod_id ASC
LIMIT 20

或者我可能错过了一些内容,并没有根据您的查询提出您希望从数据库获得的内容。

答案 2 :(得分:1)

可能你正在寻找这个。这将仅返回p3一次。 你在第二次左连接条件下错过了o.id.

SELECT p.*
FROM Products p
LEFT JOIN offertran ot 
ON p.prod_id = ot.prod_id
LEFT JOIN Offers o
ON o.id =  (SELECT id FROM Offers 
            Where dF<=3 AND dt>=3)

ORDER BY o.id DESC, 
          p.prod_id ASC
LIMIT 20

答案 3 :(得分:0)

您可能在offertranProducts中有两条记录,PROD_ID为p3。您可以将其更改为SELECT DISTINCT p.* FROM ...,这样就会忽略任何重复的行。

要查看offertran返回的内容,请将select p.*更改为select *