SQL : 한 번의 관계에서 부모 당 아동 기록 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 결과를 반환하지만, 하위 선택에서 한계 0,1을 제거하면 모든 제품과 모든 이미지의 전체 목록을 얻습니다.
제품 레코드 당 1 개의 이미지 레코드를 반환하기를 원합니다.
MySQL로 "프로그래머"코드를 수정했으며 잘 작동합니다.
SELECT Product.RefCode,
(Select ProductImg.ImgPath
From ProductImg
Where Product.PrdID = Img.PrdFK LIMIT 0,1) AS ImgPath
FROM Products
"Bill 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
편집 및 수정 된 'Top 1'에서 '제한 0,1'
다른 팁
MySQL은 여기에 약간의 유연성이 있습니다. 그룹을 사용하여 결과를 제품 당 하나의 행으로 제한 한 다음 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
필요한 것은 이미지 테이블의 플래그가 표시 될 기본 이미지인지 지정합니다. 임의의 이미지를 가져 오는 방법이 있지만 올바른 이미지를 가져 오는 것이 더 낫다고 생각합니다.