2013-08-06 2 views
0

ID, 주제 및 하위 주제의 세 열이있는 데이터베이스에 데이터가 있습니다. 이런 식으로,매트릭스의 형태로 데이터를 가져 오기위한 mysql 쿼리

CREATE TABLE Table2 (`id` int, `topic` varchar(5), `subtopic` varchar(6)); 
INSERT INTO Table2 (`id`, `topic`, `subtopic`) VALUES 
    (1, 'place', 'paris'), 
    (1, 'group', 'A'), 
    (1, 'group', 'B'), 
    (2, 'place', 'us'), 
    (2, 'group', 'C'), 
    (3, 'group', 'A'), 
    (3, 'water', 'salt'), 
    (4, 'water', 'sweet'), 
    (4, 'world', 'ep'), 
    (5, 'place', 'venus'), 
    (5, 'place', 'paris'), 
    (5, 'group', 'A'); 

결과 매트릭스 장소 대 주제에서 출력하고 싶습니다. 이 같은.

Paris|US|Venus 
A 2 |0 | 1 
B 1 |0 | 0 
C 0 |1 | 0 

아이디어는 하위 항목 열에서 '그룹'(A, B, C)와 '장소'(파리, 우리, 비너스)의 모든 값을 선택하는 것입니다. 그런 다음 그러한 조건을 가진 동시 발생 수를 찾으십시오.

어떻게하면 MySql에서 해결할 수 있습니까?

답변

3

당신은 groupplaces, 다음 컬럼에 행을 변환하는 CASE 표현식으로 집계 함수를 사용할 수 있습니다 얻기 위해 두 번 테이블에 가입해야합니다

select g.subtopic as `group`, 
    sum(case when p.subtopic = 'Paris' then 1 else 0 end) Paris, 
    sum(case when p.subtopic = 'US' then 1 else 0 end) US, 
    sum(case when p.subtopic = 'Venus' then 1 else 0 end) Venus 
from table2 g 
left join table2 p 
    on g.id = p.id 
    and p.topic = 'place' 
where g.topic = 'group' 
group by g.subtopic; 

SQL Fiddle with Demo를 참조하십시오.

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'sum(case when p.subtopic = ''', 
     subtopic, 
     ''' then 1 else 0 end) as `', 
     subtopic, '`') 
) INTO @sql 
FROM table2 
where topic = 'place'; 

SET @sql = CONCAT('SELECT g.subtopic as `group`, ', @sql, ' 
        from table2 g 
        left join table2 p 
        on g.id = p.id 
        and p.topic = ''place'' 
        where g.topic = ''group'' 
        group by g.subtopic'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

SQL Fiddle with Demo

+0

이 @JohnGalt 그래, 난 그냥했다 나의 편집 – Taryn

+0

를 참조하십시오 : 당신이 subtopic에 대한 알 수없는 값을 가지고가는 경우

, 당신은 준비된 문 및 동적 SQL을 사용할 수 있습니다 그곳에. 어떤 아이디어/튜토리얼/예를 PHP에 이런 종류의 준비/저장 문을 코딩 할 수있는 방법에 대한 예가 있습니까? – Zero

+0

@ bluefeet의 답변은 MySQL의 관점에서 나온 것입니다 (질문을 묻는대로). 저장 프로 시저 대신 PHP로 동적 SQL을 생성 할 수 있습니다. – Vatev

관련 문제