2016-10-24 3 views
1

내용과 범주를 저장할 테이블이 거의 없습니다. 내용과 범주는 많은 관계에서 많은 관계로 매핑됩니다.Mysql Crostab 쿼리

카테고리는 많은 내용을 가질 수 있습니다.

콘텐츠는 많은 카테고리에 포함될 수 있습니다.

따라서 이러한 테이블을 매핑 할 content_cat_xref 테이블을 만들었습니다.

카테고리 테이블 - ID, 이름 등

콘텐츠 테이블 - ID, 이름, type_code (read_it, play_it, prove_it, watch_it)

content_cat_xref - 등 content_id를, CATEGORY_ID,

나는 원 다음과 같이 콘텐츠 형식 및 각 콘텐츠 형식의 콘텐츠 개수가 포함 된 범주를 표시합니다. 다음과 같이

enter image description here

는하지만 얻고있다. 그 누구도 날이 문제를 해결하기 위해 경험이 이런 종류의 도움이 될 것입니다 경우

select 
ccx.category_id, 
IF(count(c.id) > 0, "True", "False") as Sections_with_content, 
(CASE WHEN (c.type_code = 'READ_IT') THEN count(c.id) ELSE 0 END) as "READ_IT", 
(CASE WHEN (c.type_code = 'WATCH_IT') THEN count(c.id) ELSE 0 END) as "WATCH_IT", 
(CASE WHEN (c.type_code = 'PLAY_IT') THEN count(c.id) ELSE 0 END) as "PLAY_IT", 
(CASE WHEN (c.type_code = 'PROVE_IT') THEN count(c.id) ELSE 0 END) as "PROVE_IT", 
count(c.id) 
    from content_cat_xref as ccx left outer join content as c 
    on ccx.content_id = c.id 
    group by ccx.category_id, c.type_code 

을 다음과 같이

enter image description here

내 쿼리입니다.

답변

1

c.type_code으로 그룹화하지 마십시오. 여러 가지 형식이 개별 레코드로 그룹화됩니다. 조건부 개수의 전체적인 점은 전체 그룹 전체 (이 경우 category_id)에서 작업하고 관련 개수 만 반환하는 것입니다.

UPDATE

당신은 또한 조건부 계산을 할 방법을 변경해야합니다. 조건은 모든 경우에 결과를 표시하기를 원하므로 조건은 count() (또는 sum()) 함수 내에 있어야하며이 함수의 외부가 아니어야합니다. 그래서,

(CASE WHEN (c.type_code = 'READ_IT') THEN count(c.id) ELSE 0 END) as "READ_IT" 

대신

COUNT(CASE WHEN (c.type_code = 'READ_IT') THEN 1 ELSE NULL END) as "READ_IT" 

설명을 다음 case 문은 조건이 일치하는 경우 값 1을 반환하고, 그렇지 않은 경우 null을 반환합니다. Count() 함수는 null이 아닌 모든 값을 계산합니다. 위의 예를 기반으로 다른 모든 필드의 표현식을 변경하십시오.

+0

의견을 주셔서 감사합니다. 그런 다음 잘못된 유형 코드로 총 개수가 표시됩니다. 이 경우 관련 개수를 검색하도록 도와 주시겠습니까? – cha

+0

죄송 합니다만, 귀하의 후속 질문을 이해할 수 없습니다. – Shadow

+0

흠, 알았어. 잠시 후에 내 대답을 업데이트 할거야. – Shadow