나는 가 필드로 그룹 있지만, 만약 다른 필드로 비어있는 그룹
내가 tableNum 그룹화하고 싶습니다 tableNum라는 칼럼 deviceNum
라는 또 다른 열이있는 테이블을 가지고 있지만 tableNum 다음 비어있는 경우 나는 것 groupNum으로 그룹화해야합니다.나는 두 가지 다른 문장을 할 수 있도록이 작업을 현재 통합 문서로 수행했지만, 더 좋은 방법이 있는지 궁금해했다.
많은 감사
데이브
나는 가 필드로 그룹 있지만, 만약 다른 필드로 비어있는 그룹
내가 tableNum 그룹화하고 싶습니다 tableNum라는 칼럼 deviceNum
라는 또 다른 열이있는 테이블을 가지고 있지만 tableNum 다음 비어있는 경우 나는 것 groupNum으로 그룹화해야합니다.나는 두 가지 다른 문장을 할 수 있도록이 작업을 현재 통합 문서로 수행했지만, 더 좋은 방법이 있는지 궁금해했다.
많은 감사
데이브
가 UNION
을 유지하고 작동합니다 ypercube 진술로 MySQL이 시도 하위 쿼리
할 수 있습니다 유착/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
대신 GROUP BY의 HAVING 시도 당신의 그룹에서 case by를 사용할 수도 있습니다. –
@Lucas, 병렬화 외에도, UNION이 없다면 거의 모든 필드에서 SELECT리스트에 CASE를 사용해야 할 것입니다. 그리고 GROUP BY CASE는 인덱스를 사용할 수 없습니다. –
@ypercube : True. 그러나 IFNULL (..)에 의한 *와 * 그룹핑을 선택하는 것은'CASE' 절만큼 나쁘지 않습니다 ... –
을 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
이 경우 –