2012-04-26 5 views
0

JVM으로 변환하는 기존 LAMP 응용 프로그램이 있습니다.MySQL : 단일 열 SUM (IF (cond, a, b)) vs muti-column Sum()

문제는 @ 250K 레코드가있는 채점 테이블을 필요로합니다. 현재 "scoreType"열은 tinyint로 표시됩니다. 여기서 1 = 목표, 2 = 지원 1, 3 = 지원 2입니다. ,하지만 난 측면에서, 만약 을 작업 궁금 않습니다 제법

SUM(IF(scoreType=1,1,0)) AS goals, SUM(IF(scoreType=2,1,IF(scoreType=3,1,0))) AS assists 

: 같은

득점 지도자를위한

는 각 플레이어의 목표/assist1/assist2 합계를 얻기 위해, 쿼리 조각이 보인다 쿼리 컨텍스트가 SUM, COUNT 등의 작업을 수반하는 일반적인 스키마 디자인, tinyint 방식이 아닌 goal/assist1/assist2, win/loss/tie 등의 제한된 선택 세트를 별도의 열로 구분하는 것이 좋습니다.

별도의 컬럼에서 쿼리는 다음이된다 : 성능 승리 (필요가 없습니다에 대한 경우 (콘드, A, B) 경기) 약간 증가 스토리지의 비용 (3 열 대입니다

SUM(goal) AS goal, SUM(assist1) AS assist1, SUM(assist2) AS assist2 

을 1).

응용 프로그램 계층에서 잠재적 인 큰 승리 중 하나는 ORM 지원되지 않는 SUM (if())에서 column.Sum()으로 이동하는 것입니다. 그렇지 않으면 필자는 올인원 컬럼 방식을 사용하여 정적이 아닌 형식의 문자열 SQL 쿼리를 유지해야합니다.

생각 하시겠습니까? 있는 그대로 유지하거나 DB 및 응용 프로그램 코드를 3 열 방식으로 마이그레이션하는 방법은 무엇입니까?

의견에 감사드립니다.

답변

1
SELECT scoreType, COUNT(scoreType) 
FROM ... 
GROUP BY scoreType 

그렇지 않습니까?


대체 방법을 비교할 정직한 타이밍을 얻으려면 더 자세한 정보를 사용하십시오.

SELECT COUNT(CASE WHEN scoreType = 1 THEN id ELSE NULL END) AS goals, 
     ... 
+0

내가 말했듯이, 목표와 어시스트는 의미 상으로 다릅니다. 예를 들어, 득점 선두는 목표, asisst1, 보조 2로 정렬 할 수 있습니다. scoreType을 사용하는 ORDER BY 목표는 무엇입니까? 또한 쿼리가 플레이어 당 3 행을 반환하는 것처럼 보입니다. – virtualeyes

+0

그래, 그렇지 않은 경우 구조화 된 솔루션이 더 적합하지 않을지 궁금합니다. –

+0

+1 네, 램프 응용 프로그램을 더 볼수록 더 심각한 구조 조정이 필요하다고 생각합니다 ;-) 스포츠는 아이스 하키입니다. 따라서 assist1, assist2 (축구/축구와 달리 하나의 도우미) – virtualeyes