2012-10-03 159 views
3

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

的问题

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

0

你可能在offertranProducts两个记录与P3的PROD_ID。你可以改变它是SELECT DISTINCT p.* FROM ...而这种方式的任何重复的行会被忽略

只是为了看看offertran正在恢复,改变你select p.*select *

+0

我有P3亚当只有一个记录。感谢您的回复 – Anusha

1

也许参加“O”和“旧约”之间的状态丢失:

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 
+0

这不是我想要的..在这里,我失去了我的所有序列..反正..谢谢你的回答 – Anusha

+0

@Anusha但这个查询是工作,我测试过。 –