2017-11-29 18 views
0

병합 할 SQL 쿼리가 2 개 있습니다. 유감스럽게도 MYSQL에 익숙한 사용자는 아닙니다. 구조가 잘못이다, 내가 원하는 모든 데이터를 얻을UNION 쿼리가 여분의 열을 반환하지 않습니다.

-----------------------|-------------------- 
species    | f 
-----------------------|-------------------- 
M_A_1789    | 5 
-----------------------|-------------------- 
M_A_1789    | 1 
-----------------------|-------------------- 
M_A_1731    | 5 
-----------------------|-------------------- 
M_A_1731    | 1 

Allthough이 같은

SELECT animal.species, count(animal.species) as f 
FROM disp, animaldesc, animal 
WHERE disp.disp_id = animaldesc.disp_id 
AND animaldesc.authored = 1 
AND animaldesc.animal_id = animal.id 
GROUP BY animal.species 
union 
SELECT animal.species, count(animal.species) as f_specific 
FROM disp, animaldesc, animal 
WHERE disp.disp_id = animaldesc.disp_id 
AND animaldesc.authored = 1 
AND animaldesc.animal_id = animal.id 
AND disp.language = "en_gb" 
GROUP BY animal.species 
ORDER BY f DESC 

이 쿼리가 반환하는 데이터 : 지금이 들어

내 쿼리입니다. JOIN을하는 대신 UNION을 사용하는 것과 관련이 있다고 생각합니다. 그러나 나는 f_specific이 f보다 적은 행을 반환 할 수 있으므로 어떤 유형의 JOIN을 사용할 지 확신하지 못합니다.

UNION 메서드를 사용하는 것 이외의 두 쿼리를 결합하는 명확한 설명을 찾을 수 없습니까? JOIN 키워드를 사용하여 쿼리에서 다음을 반환하는 방법은 무엇입니까?

-----------------------|------------|--------------- 
species    | f   | f_specific 
-----------------------|------------|--------------- 
M_A_1789    | 5   |  1 
-----------------------|------------|--------------- 
M_A_1731    | 5   |  1 
-----------------------|------------|--------------- 

감사합니다.

답변

3

당신이 필요로하는 쿼리 (하위 쿼리 GROUP BY없이) 다음과 같은 변형을 사용할 수 있다고 생각 시도는 다음과 같습니다

SELECT animal.species, 
    COUNT(animal.species) AS f, 
    SUM(IF(disp.language = "en_gb", 1, 0)) AS f_specific 
FROM disp, animaldesc, animal 
WHERE disp.disp_id = animaldesc.disp_id 
    AND animaldesc.authored = 1 
    AND animaldesc.animal_id = animal.id 
GROUP BY animal.species 

UNION의 첫 번째 검색어는입니다. disp.language = 'en_gb' 인 각 행에 대해~ f_specific 예상 결과 집합을 반환해야합니다.

+1

IF (disp.language = "en_gb", 1, 0)'에 'IF (disp.language = "en_gb"), 1, 0을 입력하십시오. – Leran2002

+0

예,이 쿼리가 작동했습니다. IF 문에 문제가있어서, 그것을 'SUM'으로 대체했습니다 (disp.language = "en_gb"then then else 0 end). AS f_specific' Thanks! –

+0

아, 'IF'의 닫는 괄호가 잘못 배치되었습니다. 나는 그것을 지금 고쳤다. – axiac

0

이 쿼리

SELECT species,SUM(f) AS f,SUM(f_specific) AS f_specific 
FROM 
    (
    SELECT animal.species, count(animal.species) AS f, NULL AS f_specific 
    FROM disp, animaldesc, animal 
    WHERE disp.disp_id = animaldesc.disp_id AND animaldesc.authored = 1 AND animaldesc.animal_id = animal.id 
    GROUP BY animal.species 

    UNION ALL 

    SELECT animal.species, NULL AS f, count(animal.species) AS f_specific 
    FROM disp, animaldesc, animal 
    WHERE disp.disp_id = animaldesc.disp_id AND animaldesc.authored = 1 
     AND animaldesc.animal_id = animal.id AND disp.language = "en_gb" 
    GROUP BY animal.species 
) AS q 
GROUP BY species 
ORDER BY f DESC 

아니면 당신이

SELECT species,SUM(f) AS f,SUM(f_specific) AS f_specific 
FROM 
    (
    SELECT animal.species, 1 AS f, 0 AS f_specific 
    FROM disp, animaldesc, animal 
    WHERE disp.disp_id = animaldesc.disp_id AND animaldesc.authored = 1 AND animaldesc.animal_id = animal.id 

    UNION ALL 

    SELECT animal.species, 0 AS f, 1 AS f_specific 
    FROM disp, animaldesc, animal 
    WHERE disp.disp_id = animaldesc.disp_id AND animaldesc.authored = 1 
     AND animaldesc.animal_id = animal.id AND disp.language = "en_gb" 
) AS q 
GROUP BY species 
ORDER BY f DESC