2011-11-30 3 views
2

내가 아래에있는 내 코드를 사용하여 동일한 범주 또는 항목의 두 따기 피하기 위해 노력하고 ...mysql을 작동하지 않는 별개의

그 작업을 잘하지만, 아주 가끔이 표시 중복 카테고리 ...

SELECT DISTINCT 
    exp_categories.cat_id, exp_categories.cat_name, exp_categories.cat_url_title 
     ,exp_category_posts.entry_id, exp_channel_titles.status 
    FROM (exp_categories 
    LEFT JOIN exp_category_posts 
      ON exp_categories.cat_id = exp_category_posts.cat_id) 
    LEFT JOIN exp_channel_titles 
      ON exp_category_posts.entry_id = exp_channel_titles.entry_id 
    WHERE exp_categories.group_id = 2 
     AND exp_category_posts.entry_id IS NOT NULL 
     AND exp_channel_titles.status = 'open' 
    GROUP BY exp_categories.cat_id 
    ORDER BY RAND() 
    LIMIT 2 
+0

카테고리가 여러 번 표시 될 때 모든 열이 동일한 값을 표시한다는 점이 긍정적입니까? –

+0

어떻게해야할까요? 간단한 단어로 무엇을 보여 주길 원하십니까? –

+0

mmmm 확인하고 2 초 후에 돌아옵니다 – Andy

답변

2

SELECT DISTINCT은 고유 한 행 즉 모든 열의 고유 한 조합을 보여야합니다.

+0

DISTINCT를 제거해야합니까? – Andy

+1

그것은 당신이 성취하고자하는 것에 달려 있습니다. 나는 당신의 설명 int에 의해 그가 질문에 대해 언급 할 수있는 것을 위해, 당신은'group by '을 대신 보거나 선택 목록에서 카테고리를 제거하기를 원할 것입니다. –

+0

문제는 올바른 프로젝트를 얻기 위해 페이지로 보내려는 카테고리 ID가 필요하다는 것입니다 ... – Andy

0

우선, 외부 조건 인 exp_channel_titles.status = 'open'은 JOINS의 오른쪽 부분에 절대 적용되지 않으므로 여기서는 외부 JOINS가 필요하지 않습니다.

SELECT 
    c.cat_id, 
    c.cat_name, 
    c.cat_url_title, 
    cp.entry_id, 
    ct.status 
FROM exp_categories c 
JOIN exp_category_posts cp 
    ON c.cat_id = cp.cat_id 
JOIN exp_channel_titles ct 
    ON cp.entry_id = ct.entry_id 
WHERE c.group_id = 2 
    AND ct.status = 'open' 
GROUP BY c.cat_id 
ORDER BY RAND() 
LIMIT 2 

cat_id로 그룹화하면 쿼리는 분명히 다른 entry_id에 대해 중복 된 카테고리가됩니다. 그룹화하면이 문제가 해결되지만 예상 결과가 분명하지 않습니다.

+0

내가 지금 기억하고있는 고유 한 가치 - 데이터를 가지고 돌아 오는 항목을 막기 위해 거기에 넣는다. – Andy

+0

@andy, 미안하지만, 당신의 의견 = 이해할 수 없다.) – newtover