SQL:ステートメントは、1対多の関係で親あたり1つのレコードを表示します
-
23-08-2019 - |
質問
私は2つのテーブル、商品テーブルと画像テーブルを有しています。製品には、レコードごとに1枚の以上の画像を持つことができます。私は、1枚の製品あたりの画像ではなく、製品ごとのすべての画像が一覧表示されます、SQL文を必要としています。
私の現在の努力のスケールダウン例があります:
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;
上記の例では、0の結果を返しIサブからLIMIT 0,1を削除する場合、しかし、私はすべての製品とすべての画像の完全なリストを取得し選択します。
私は、製品レコードにつき1つの画像レコードが返されることにしたい。
<時間>私は、MySQLに「プログラマ」のコードを改訂している、それが正常に動作します。
SELECT Product.RefCode,
(Select ProductImg.ImgPath
From ProductImg
Where Product.PrdID = Img.PrdFK LIMIT 0,1) AS ImgPath
FROM Products
は、「ビルKarwinの」ソリューションをしようといくつかの理由、それは長い時間のために、サーバーの負荷を送信します。
解決
この作業をする必要があります:
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
'0,1を制限' に 'トップ1' を編集して修正します。
他のヒント
MySQLはここにいくつかの柔軟性を有します。あなたは、製品ごとに1つの行に結果を制限するためにGROUP BYを使用することができ、その後、MySQLは任意にどの画像を選択します。実際には、データベースに物理的に最初に格納された画像になる傾向がありますが、それを制御することはできません。
SELECT p.RefCode, i.ImgPath
FROM Product p INNER JOIN ProductImg i
ON (p.PrdID = i.PrdFK)
GROUP BY p.PrdID;
あなたは、製品ごとに1 の特定ののイメージをしたい場合は、、あまりにもそれを行うための方法があります。あなたの要件にそれを含める必要があります。 : - )
あなたがイメージ・テーブル上の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
あなたが必要なもの、表示されるメイン画像であるかどうかを指定するために、画像テーブル上のフラグです。そこ任意の画像を引き上げる方法がありますが、私はあなたが正しいイメージを引っ張ることを確認する方が良いと思います。