質問

これは非常に似ています 結合されたテーブルから1つの行まで結果を制限します, 、しかし、私はそれを必要に応じて正確に動作させるのに苦労しています...

テーブル構造は非常に似ています:

CREATE TABLE tblProducts (
    intProductID int(11) NULL AUTO_INCREMENT,
    strProductName varchar(255) NULL,
    PRIMARY KEY (intProductID)
);

CREATE TABLE tblProductImages (
    intImageID int(11) NULL AUTO_INCREMENT,
    intProductID int(11) NULL,
    strImageName varchar(255) NULL,
    intOrder int(11) NULL,
    PRIMARY KEY (intImageID)
);

テーブルを入力します:

INSERT INTO tblProducts (strProductName)
VALUES
('Product #1'), ('Product #2'), ('Product #3');

INSERT INTO tblProductImages (intProductID, strImageName, intOrder) 
VALUES
(1, 'image_for_1.jpg', 1), 
(2, '1st_image_for_2.jpg', 1), 
(2, '2nd_image_for_2.jpg', 2);

適切な画像を使用して、3つの製品すべてを返すSelectを実行したいと思います。に似ている:

intProductID, strProductName, strImageName
1, Product #1, image_for_1.jpg
2, Product #2, 1st_image_for_2.jpg
3, Product #3, NULL

簡単な解決策は次のとおりです。

SELECT intProductID, strProductName, 
 (SELECT strImageName
  FROM tblProductImages
  WHERE tblProductImages.intProductID = tblProducts.intProductID
  ORDER BY intOrder
  LIMIT 1)
FROM tblProducts

しかし、TBLProductimagesから別のフィールドを追加して返すと、これは失敗します(たとえばAltText)

フィドルをセットアップしました http://sqlfiddle.com/# !2/883c5/1

ありがとう

役に立ちましたか?

解決

これは機能しますが、非常に醜いです

select p.intProductId, p.strProductName, pi.strImageName 
from tblProducts p
inner join tblProductImages pi on pi.intProductID = p.intProductId
inner JOIN (select min(intOrder) minOrder, intProductID
           FROM tblProductImages
           GROUP BY intProductID) s
           on s.intProductID = p.intProductID and s.minOrder = pi.intOrder
union
select p.intProductId, p.strProductName, pi.strImageName
from tblProducts p
left join tblProductImages pi on pi.intProductID = p.intProductId
where pi.intProductID is null;

別 :

select p.intProductId, p.strProductName, pi.strImageName
from tblProducts p
left join tblProductImages pi on pi.intProductID = p.intProductId
where pi.intProductId is null or pi.IntOrder = (select min(intOrder)
                                                from tblProductImages
                                                where intProductId = pi.intProductId);

sqlfiddle

他のヒント

集約を使用する必要があります(具体的には GROUP BY)。あなたはしたい GROUP BY 製品名と使用 LEFT JOIN 画像が存在する必要がないように。

SELECT strProductName, strImageName
FROM tblProducts LEFT JOIN tblProductImages USING (intProductID)
GROUP BY strProductName

この場合に選択されている画像は ランダム (通常は入ります intImageID 注文)。これは、特定の製品に関連付けられている限り、取得された実際の画像が重要ではないことを前提としています。

http://sqlfiddle.com/# !2/1391e6/1

その正確な出力のために、テーブルtblproductimagesの挿入ステートメントを次のように変更する必要があるかもしれません。

INSERT INTO tblProductImages (intProductID, strImageName, intOrder) VALUES
    (1, 'image_for_1.jpg', 1), (2, '1st_image_for_2.jpg', 1), (3, '2nd_image_for_3.jpg', 2);

以下の選択ステートメントを使用します。

SELECT tP.intProductID, tp.strProductName, tPI.strImageName
FROM tblProducts AS tP 
INNER JOIN tblProductImages AS tPI ON tP.intProductID = tPI.intProductID;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top