使用子查询连接三个表进行左连接

3

点击此处查看数据库和表的演示

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个回答

4
问题在于:
LEFT JOIN Offers o
ON ot.offer_id =  (SELECT id FROM Offers 
                   Where dF<=3 AND dt>=3)

你将ot.offer_id与常量值连接(你没有从offers表中选择它们)。
正确的方式:
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

Look at this SQLFiddle


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

或许我错过了什么,没有理解你想通过查询从数据库中获取什么。


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

这不是我想要的...在这里我失去了所有的序列...无论如何...感谢你的回答。 - Anusha

0
你可能有两条记录在 offertran 或者 Products 表中,使用 PROD_ID=p3。你可以将它改为 SELECT DISTINCT p.* FROM ...,这样任何重复的行都会被忽略。
只是为了看看 offertran 返回了什么,将你的 select p.* 改为 select *

我只有一条记录是p3 Adam。感谢您的回复。 - Anusha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接