2014-05-20 4 views
0

디렉토리 유형 사이트의 기존 mysql 데이터베이스에 4 개의 테이블이 있습니다. 표 mt_links은 (CAT_ID = 1 난 단지 원하는) 표 mt_cfvalues ​​각 그것은 값을 표 mt_images를 반복 할 수 있습니다 목록에 대한 자세한 내용을 포함하고 위의 나열하는 것은 어떤 범주에 인이 포함 된 각 목록 표 mt_cl에 대한 기본 정보 이미지의 이름을 포함을 포함 각 목록에 대해여러 테이블에서 레코드를 가져옵니다. 일부는 고유하지 않습니다.

mt_clcat_id = 1 인 모든 레코드를 mt_links에서 원하고 각각의 레코드에 대해 link_id와 일치하는 모든 레코드가 mt_cfvalues ​​및 cf_images에 필요합니다.

Group_Concat 및 왼쪽 조인으로 select를 설정했지만 결과에 반복되는 값이 표시됩니다. Distinct를 추가하여 반복되는 값을 고쳤습니다. 그러나 mt_cfvalues는 동일한 값을 가진 레코드를 가질 수 있으므로 지금해야 할 가치가 없습니다. http://www.sqlfiddle.com/#!2/f39e9/1

쉬운 방법이 있나요 :

SELECT a.link_id, 
      a.link_name, 
      a.link_desc, 
      GROUP_CONCAT(DISTINCT b.value ORDER BY b.cf_ID) AS details, 
      GROUP_CONCAT(DISTINCT c.filename ORDER BY c.ordering) AS images 
FROM  mt_links a 
LEFT JOIN mt_cfvalues b ON a.link_id = b.link_ID 
LEFT JOIN mt_images c ON b.link_id = c.link_ID 
LEFT JOIN mt_cl d ON a.link_id = d.link_ID WHERE d.cat_ID = '1' 
GROUP BY a.link_id 

내가 함께 여기에 SQLFiddle을 넣어? 반복/반복 문제를 해결하려면 어떻게합니까?

+0

반복되는 값을 만나면 어떻게 될까요? – James

+0

mt_cfvalues의 반복 값이 내 결과에 포함되어야합니다. 내 피들에, 링크 ID 1 ... 자세히 열에는 "좋은, 아니 고양이, 좋은"을 반환해야합니다 – DaveS

답변

0

여기에 귀하가 추구하는 것을 달성하는 한 가지 방법이 있습니다. 두 개의 하위 쿼리가 독립적 인 결과를 반환하기 때문에 GROUP BY를 결합 할 수 없으므로 중복 된 결과를 얻었습니다.

SELECT a.link_id, 
      a.link_name, 
      a.link_desc, 
      cvf.details, 
      imgs.images 
FROM  mt_links a 
LEFT JOIN (
    SELECT link_ID, GROUP_CONCAT(value ORDER BY cf_ID) AS details 
    FROM mt_cfvalues 
    GROUP BY link_ID 
) cvf ON cvf.link_ID = a.link_id 
LEFT JOIN (
    SELECT link_ID, GROUP_CONCAT(filename ORDER BY ordering) AS images 
    FROM mt_images 
    GROUP BY link_ID 
) imgs ON imgs.link_ID = a.link_id 
INNER JOIN mt_cl d ON a.link_id = d.link_ID 
WHERE d.cat_ID = '1' 
+0

제임스 감사합니다. 그게 내가 필요한거야. – DaveS

관련 문제