3

DBとテーブルについてはこのフィドルを確認してください

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は2回表示されています。理由はわかりません..可能な限りの方法を試しましたが、解決策が見つかりません.. :(

4

4 に答える 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

このSQLFiddleを見てください

于 2012-10-03T08:39:21.500 に答える
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

あるいは、何かを見逃していて、クエリでDBから何を取得したいかを理解していなかったのかもしれません。

于 2012-10-03T08:34:51.450 に答える
1

あなたはこれを探しているのかもしれません。これにより、p3が1回だけ返されます。2番目の左結合状態で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
于 2012-10-03T08:37:45.940 に答える
0

おそらく、p3のPROD_ID内offertranまたはその中に2つのレコードがあります。Productsこれを変更するとSELECT DISTINCT p.* FROM ...、重複する行はすべて無視されます。

offertranが戻ってくるかを確認するために、次のように変更select p.*しますselect *

于 2012-10-03T08:31:01.793 に答える