2012-01-08 3 views
2

SQL을 사용하지 않기 때문에이 글에서 다소 분실했습니다.SQL 관련 이미지가있는 항목을 선택하십시오.

나는 세 개의 테이블이 있습니다

이미지 (ID, IMAGE_PATH를)

shop_entries (ID, 제목, ....)

shop_img (shop_id, img_id) 내가 원하는

모든 상점 항목 및 연관된 이미지를 표시합니다. 현재 제 SQL은 shop_entries를 여러 번 (각 시간에 연관된 1 개의 이미지로) 리턴하고 있습니다. shop_entries를 한 번만 반환하지만 여러 이미지가 연결된 상태로 반환하고 싶습니다.

SELECT s.*, images.* 
FROM shop_entries s 
LEFT JOIN shop_img ON shop_img.shop_id = s.id 
LEFT JOIN images ON images.id = shop_img.img_id 

업데이트 * 대답 아래는 작동했지만 지금은 쿼리, 같은 원리로 다른 테이블을 추가하고 싶었 : 이미지 외에 내가 테이블 "크기"가

내 SQL은 다음과 같습니다 및 "shop_sizes".

Select SE.* 

, Group_Concat(I.path Order By I.path ASC Separator ', ') as images 
, Group_Concat(S.title Order By S.title ASC Separator ', ') as sizes 
From shop_entries As SE 

      Left Join shop_img As SI 
       On SI.shop_id = SE.id 
      Left Join images As I 
       On I.id = SI.img_id 

      Left Join shop_sizes As SS 
       On SS.shop_id = SE.id 
      Left Join sizes As S 
       On S.id = SS.size_id 

     Group By SE.id, SE.title 
+0

이미지는 어떻게 표시되어야합니까? 쉼표로 구분 된 경로 목록? – Thomas

+0

하나의 항목에 여러 개의 이미지가있는 경우 예상되는 결과를 표시하십시오 – zerkms

답변

1

그룹 이미지와 별도로, 다음 최종 출력 얻기 위해 shop_entries에 결과 세트에 가입 크기 : :

이 쿼리는 이중 이미지와 두 배 크기 결과는 잘못 여기에 무엇

SELECT 
    SE.*, 
    COALESCE(GI.images, '') AS images, 
    COALESCE(GS.sizes, '') AS sizes 
FROM shop_entries AS SE 

    LEFT JOIN (
    SELECT 
     SI.shop_id, 
     GROUP_CONCAT(I.path ORDER BY I.path ASC SEPARATOR ', ') AS images 
    FROM shop_img AS SI 
     INNER JOIN images AS I ON SI.img_id = I.id 
    GROUP BY SI.shop_id 
) AS GI ON SE.id = GI.shop_id 

    LEFT JOIN (
    SELECT 
     SS.shop_id, 
     GROUP_CONCAT(S.title ORDER BY S.title ASC SEPARATOR ', ') AS sizes 
    FROM shop_sizes AS SS 
     INNER JOIN sizes AS S ON SS.size_id = S.id 
    GROUP BY SS.shop_id 
) AS GS ON SE.id = GS.shop_id 
+0

이 솔루션은 경로 목록이 제목 목록과 일치하지 않을 가능성을 나타냅니다. 예를 들어, 다음 경로를 상상해보십시오 ("A : \ Foo.jpg", 15KB) ("A : \ Zulu.jpg", 10KB). 그러나 Group_Concat 두 호출에 동일한 Order By를 지정하면 path 및/또는 size가 null이 될 수없는 한 쌍의 결과가 제공됩니다. – Thomas

+0

@ 토마스 : 귀하의 쪽지는 우리가 다른 질문을 읽었 음을 나타내야합니다. 나는 크기가 어떤 것인지 전혀 모르지만, 당신은 그들이 이미지와 관련이 있다고 생각하는 것 같습니다. 나는 협회가'이미지'나'크기'중 하나의 컬럼 형태로 구현 될 것으로 기대하지만 디자인은 제 것이 아닙니다. 따라서, 당신은 당신의 평가에서 꽤 옳을 수도 있습니다. –

3
Select SE.ie, SE.title 
    , Group_Concat(I.image_path Order By I.image_path ASC Separator ', ') 
From shop_entries As SE 
    Left Join shop_img As SI 
     On SI.shop_id = SE.id 
    Left Join images As I 
     On I.id = SI.img_id 
Group By SE.ie, SE.title 
+0

+1. 그러나 mysql의 경우에는 'SE.ie'만 그룹화하면 충분합니다. – a1ex07

+0

@ a1ex07 - 기술적으로 예, 나는 ID로만 그룹을 지정해야하지만, 그룹으로 묶는 열을 명시 적으로 사용하는 것이 더 명확합니다. – Thomas

+0

이것이 효과가 있습니다! group_concat 뒤에 "as as images"를 추가하여 결과에서 더 나은 형식을 지정했습니다. 도와 주셔서 감사합니다. –

관련 문제