문제

이것은 매우 유사합니다 결합 된 테이블에서 하나의 행으로 결과를 제한합니다,하지만 필요한대로 정확히 일하도록 고군분투하고 있습니다 ...

테이블 구조는 매우 유사합니다.

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 개의 제품을 모두 반환하는 선택을하고 싶습니다. 비슷하다:

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

그러나 TBLPRODICTIMATES에서 다른 필드를 추가하고 반환하려는 경우 (예 : 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 제품 이름과 사용 a LEFT JOIN 이미지가 존재할 필요가 없습니다.

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

이 경우 선택한 이미지는 다음과 같습니다. 무작위의 (보통 그것은있을 것입니다 intImageID 주문하다). 이것은 검색된 실제 이미지가 주어진 제품과 관련이있는 한 중요하지 않다고 가정합니다.

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

이 정확한 출력을 위해서는 테이블 TBLPRODICTIMATES에 대한 삽입 문을 수정해야 할 수도 있습니다.

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 문을 사용하십시오.

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