2011-09-08 2 views
2

나는 가 필드로 그룹 있지만, 만약 다른 필드로 비어있는 그룹

내가 tableNum 그룹화하고 싶습니다 tableNum라는 칼럼 deviceNum

라는 또 다른 열이있는 테이블을 가지고 있지만 tableNum 다음 비어있는 경우 나는 것 groupNum으로 그룹화해야합니다.

나는 두 가지 다른 문장을 할 수 있도록이 작업을 현재 통합 문서로 수행했지만, 더 좋은 방법이 있는지 궁금해했다.

많은 감사

데이브

+0

이 경우 –

답변

1

UNION을 유지하고 작동합니다 ypercube 진술로 MySQL이 시도 하위 쿼리

5

할 수 있습니다 유착/IFNULL에 의해 그룹 (그들은이 예에서와 동일한 것) :

http://dev.mysql.com/doc/refman/5.5/en/comparison-operators.html#function_coalesce

:

GROUP BY COALESCE (tableNum, deviceNum) 
GROUP BY IFNULL (tableNum, deviceNum) 

은 설명서를 참조하십시오

무의미한 그룹화가있을 수 있습니다. c 두 열이 동일한 값을 유지해야하는 경우 tableNum과 deviceNum 사이의 간격을 지정합니다. 당신이 얻고 싶은 결과의 유형에 따라 다음의 충돌을 방지하기 위해, 다음처럼 작성할 수 있습니다 :

GROUP BY CASE WHEN tableNum IS NOT NULL 
       THEN CONCAT('tableNum : ', tableNum) 
       ELSE CONCAT('deviceNum : ', deviceNum) 
       END 

가 매우 느려질 수 있습니다,하지만, 인덱스를 사용하는 기회가없는 CONCAT처럼 .. 당신에게 아이디어를주기 위해서. 참고 : UNION ALL와 함께, 귀하의 요구 사항으로,

SELECT ... 
FROM your_table 
GROUP BY 
    CASE 
    WHEN tableNum IS NOT NULL THEN tableNum 
    ELSE deviceNum 
    END 
+0

대신 GROUP BY의 HAVING 시도 당신의 그룹에서 case by를 사용할 수도 있습니다. –

+0

@Lucas, 병렬화 외에도, UNION이 없다면 거의 모든 필드에서 SELECT리스트에 CASE를 사용해야 할 것입니다. 그리고 GROUP BY CASE는 인덱스를 사용할 수 없습니다. –

+0

@ypercube : True. 그러나 IFNULL (..)에 의한 *와 * 그룹핑을 선택하는 것은'CASE' 절만큼 나쁘지 않습니다 ... –

0

을 parallelise 수 있기 때문에, UNION의 thend 빠르게 할 수 있습니다.

다른 솔루션보다 훨씬 빠릅니다 (실행 최적화).

나는이 번역 또는 UNION없이 최적화해야 할 싫어하는 것 :

SELECT tableNum 
     , NULL AS deviceNum 
     , COUNT(DISTINCT deviceNum) AS cnt 
    FROM TableX 
    WHERE tableNum IS NOT NULL 
    GROUP BY tableNum 
UNION ALL 
    SELECT NULL 
     , deviceNum 
     , COUNT(*) 
    FROM TableX 
    WHERE tableNum IS NULL 
    GROUP BY deviceNum 
0

GROUP BY (IFNULL (child_id, PARENT_ID))

+0

아무 말도없이 짧은 코드의 평화를 버리는 것이 아니라 더 자세한 정보를 제공해주십시오. – bish