2012-06-15 3 views
2

다음과 같은 mysql 쿼리가 있으며 카테고리별로 항목 목록이 생성됩니다. 그러나 생성 된 항목 중 일부는 중복 된 항목입니다 (두 개 이상의 범주에 표시되기 때문에 entry_id가 중복됩니다). 중복이 없도록하려면 어떻게해야합니까? 나는 GROUP BYDISTINCT의 다른 변형을 시도했지만 성공하지 못했습니다. 고맙습니다.Mysql은 두 개의 왼쪽 조인을 사용하여 고유 항목을 가져옵니다.

SELECT ct.entry_id, ct.title, c.cat_name 
FROM exp2_categories c 
LEFT JOIN exp2_category_posts cp ON (cp.cat_id = c.cat_id) 
LEFT JOIN exp2_channel_titles ct ON (ct.entry_id = cp.entry_id) 
WHERE c.group_id = '4' 
GROUP BY c.cat_id 
ORDER BY ct.entry_date DESC 

편집 :이 범주에 여러 항목을 생성 제외

첫 번째 대답은, 중대하다. 카테고리 당 하나의 고유 항목이 필요합니다. 미안하지만, 원래의 질문에 더 구체적이어야 했어.

entry_id_1 Title 1 Category_1, Category_2 
entry_id_3 Title 3 Category_2 
entry_id_345 Title 345 Category_3 
entry_id_123 Title 123 Category_4, Category_3, Category_1 
entry_id_678 Title 678 Category_4 

원하는 결과 - 항목은 고유 및 카테고리 당 하나의 항목이 :

항목은 고유하지만, 너무 많은 항목이 - 그것은 생산하는 것을 예를 들어

,

entry_id_1 Title 1 Category_1 
entry_id_3 Title 3 Category_2 
entry_id_345 Title 345 Category_3 
entry_id_123 Title 123 Category_4 
+0

는 테이블의 예를 게시주세요 이 쿼리에서 얻은 결과의 예 –

+0

ct.entry_id로 그룹을 사용하면 어떻게됩니까 ... –

+0

ct.entry_id로 그룹을 사용할 때 고유 항목이 있지만 반복되는 범주가 있습니다. –

답변

1

"중복"되는 이유는 카테고리도 선택한다는 것입니다. 따라서 항목이 여러 카테고리에있는 경우 여러 행이 표시됩니다. 필요한 것은

group_concat() 집계 함수이다.이 그것에서의 카테고리의 쉼표로 구분 된 목록으로, 각 항목에 대해 한 행을 생성합니다

SELECT ct.entry_id, ct.title, group_concat(c.cat_name) as cat_names 
FROM exp2_categories c 
LEFT JOIN exp2_category_posts cp ON (cp.cat_id = c.cat_id) 
LEFT JOIN exp2_channel_titles ct ON (ct.entry_id = cp.entry_id) 
WHERE c.group_id = '4' 
GROUP BY ct.entry_id, ct.title 
ORDER BY ct.entry_date DESC 

+0

답변 해 주셔서 감사합니다. 카테고리별로 여러 항목을 생성한다는 점을 제외하고 이것은 훌륭합니다. 미안하지만, 제 질문에 좀 더 구체적이어야했습니다. 나는 내 질문을 수정했다. –

+0

나는 당신을 도울 수있다 : 그러나 나는 알고 있어야한다 : 당신은 여러 개의 성냥이있을 때 어느 카테고리가 선택 되든지 상관 하나? 예를 들어'entry_id_1, Title 1, Category_1, Category_2'에 대해서'Category_1' 또는'Category_2'를 얻었 으면 신경 써야합니까? 당신이 신경 쓰면 어떻게 결정하기를 원합니까? – Bohemian

+0

최종 결과에 범주 또는 항목을 반복하지 않고 모든 범주 (각각 하나의 항목)가 포함되어있는 한 각 항목에 대해 어떤 범주가 선택되는지는 상관하지 않습니다. –

관련 문제