2012-10-03 161 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但這個查詢是工作,我測試過。 –