2009-05-22 11 views
2

私は2つのテーブル、製品テーブル、およびイメージテーブルを持っています。製品は1レコードにつき1つ以上のイメージを持つことができます。私は製品ごとのすべての画像ではなく、製品ごとに1つの画像をリストするSQL文が必要です。SQL:1対多の関係で親あたり1つの子レコードを表示するステートメント

Aは私の現在の取り組みの一例をスケールダウンがある:

SELECT Product.RefCode, Img.ImgPath 
FROM Product INNER JOIN (
    SELECT ProductImg.ImgPath, ProductImg.PrdFK 
    FROM ProductImg 
    LIMIT 0,1) AS Img ON Product.PrdID = Img.PrdFK; 

私はサブからLIMIT 0,1を削除する場合は、上記の例では、しかし、0の結果を返し、私はすべての製品の完全なリストを取得するSELECTすべての画像。

商品レコードごとに1つのイメージレコードが返されます。


私は「プログラマ」コードをMySQLに改訂し、うまく動作します。

SELECT Product.RefCode, 
     (Select ProductImg.ImgPath 
     From ProductImg 
     Where Product.PrdID = Img.PrdFK LIMIT 0,1) AS ImgPath 
FROM Products 

「Bill Karwin's」ソリューションを試しているときに何らかの理由で、サーバーロードが長時間送信されました。

答えて

1

これは動作するはずです:

SELECT Product.RefCode, 
     (Select Img.ImgPath 
     From ProductImg 
     Where Product.PrdID = Img.PrdFK LIMIT 0,1) As ImgPath 
FROM Product 

あなたが選択復帰、そしてあなたは、サブセレクトでどこで、多分秩序を追加することができべき画像を決定するための方法を持っている場合。

次の例では、最新のアクティブな画像のみを取得します。

SELECT Product.RefCode, 
     (Select Img.ImgPath 
     From ProductImg 
     Where Product.PrdID = Img.PrdFK 
      And IsActive = 1 
     Order By EntryDate Desc LIMIT 0,1) As ImgPath 
FROM Product 

'Top 1'から 'Limit 0,1'に編集されて修正されました。

+0

TOPキーワードは、Microsoft SQL Server(およびSybase)の商標です。 –

+0

申し訳ありませんが、私はそれを知らなかった。どうもありがとうございました。 –

+0

小さなリビジョン(上記参照)を作成しましたが、このステートメントは正常に機能しました。 – ticallian

0

ここにはいくつかの柔軟性があります。 GROUP BYを使用して結果を製品ごとに1行に制限し、MySQLが任意のイメージを選択します。実際には、データベースに物理的に最初に格納されるイメージになる傾向がありますが、それ以上の制御はありません。

SELECT p.RefCode, i.ImgPath 
FROM Product p INNER JOIN ProductImg i 
    ON (p.PrdID = i.PrdFK) 
GROUP BY p.PrdID; 

あなたが製品ごとに1枚の特定の画像が必要な場合は、あまりにもそれをする方法があります。それを要件に含める必要があります。 :-)

0

あなたがイメージ・テーブル上のID列を持っている場合、これは(どんなSQL製品またはバージョン)が動作してはならない -

SELECT 
      p.RefCode, 
      i1.ImgPath 
    FROM 
      Product p 
    INNER JOIN 
      ProductImg i1 ON p.PrdId = i1.PrdFk 
    LEFT JOIN 
      ProductImg i2 ON i1.PrdId = i2.PrdId 
      AND i1.ImgId < i2.ImgId 
    WHERE 
      i2.ImgId IS NULL 
0

何それが表示される主画像であるかどうかを指定するフラグがImageテーブルに必要です。任意の画像を引く方法はありますが、正しい画像を確実に引っ張ることをお勧めします。

関連する問題