2012-11-30 7 views
1

여기에 세 개의 테이블이 있는데, 난 복잡한 쿼리를 사용하려고합니다.합산 된 SUM 쿼리의 MySQL 쿼리 문제

표 1 (팀) 거기에 팀이 있습니다

id  name 
------------ 
150 LA Lakers 
151 Boston Celtics 
152 NY Knicks 

표 2 (점수를) 거기에 점수를 가지고

id teamid week score 
--------------------------- 
1  150  5  75 
2  151  5  95 
3  152  5  112 

표 3 (티켓)

거기에 티켓을 가지고
id teamids week 
--------------------- 
1 150,152,154 5 
2 151,154,155 5  

내가 쓰려고하는 두 가지 쿼리가 있습니다. 이 쿼리를 실행할 때마다 이들을 합산하려고하는 것이 아니라 ickets, weekly_score 필드를 티켓에 추가했습니다. 팀에 새로운 점수가 입력 될 때마다 팀 ID를 가져 와서 해당 팀/주 콤보가있는 모든 티켓을 가져 와서 팀 점수 합계에 따라 업데이트 할 수 있습니다.

나는 내가 찾고 결과를 얻을 수있는 다음을 시도했다 (I 시도하고 그들을 업데이트하기 전에) :

SELECT t.id, t.teamids, (
    SELECT SUM(s1.score) 
    FROM scores s1 
    WHERE s1.teamid 
    IN (
    t.teamids 
    ) 
AND s1.week =11 
) AS score 
FROM tickets t 
WHERE t.week =11 
AND (t.teamids LIKE "150,%" OR t.teamids LIKE "%,150") 

뿐만 아니라 쿼리 느리지 만, 또한 반환하지 보인다 점수의 합계, 그것은 단지 목록의 첫 번째 점수를 반환합니다.

도움을 주시면 대단히 감사하겠습니다.

+1

'(t.teamids)'를'IN()'절로 대체 할 수 없습니다. MySQL은이를 IN() 절에서 하나의 문자열로 간주한다. IN ('150,152,154') 대신에 3 개의 값이있다. –

+2

여기서 가장 좋은 해결책은'tickets' 테이블을 적절하게 정규화하여'teamid' 당 하나의 행을 포함하는 것입니다. –

+0

티켓 테이블을 팀과 주당 하나의 레코드로 정규화해야합니다. – Wolf

답변

0

일치 시키려면 팀 ID가 하나 뿐인 열을 수용해야합니다. 또한 SELECT 하위 쿼리에서 LIKE를 수행해야합니다.

SELECT t.id, t.teamids, (
    SELECT SUM(s1.score) 
    FROM scores s1 
    WHERE 
    (s1.teamid LIKE t.teamids 
     OR CONCAT("%,",s1.teamid, "%") LIKE t.teamids 
     OR CONCAT("%",s1.teamid, ",%") LIKE t.teamids 
    ) 
    AND s1.week =11 
) AS score 
FROM tickets t 
WHERE t.week =11 
AND (t.teamids LIKE "150,%" OR t.teamids LIKE "%,150" OR t.teamids LIKE "150") 
0

여기에 SUM 기능이 필요하지 않습니까? 점수 표에 이미 나와 있니? 그리고 BTW, 하위 쿼리를 피하기 위해 왼쪽 조인 (또는 필요에 따라 왼쪽 외부 조인)을 시도하십시오.

SELECT t.id, t.name, t1.score, t2.teamids 
FROM teams t 
LEFT JOIN scores t1 ON t.id = t1.teamid AND t1.week = 11 
LEFT JOIN tickets t2 ON t2.week = 11 
WHERE t2.week = 11 AND t2.teamids LIKE "%150%" 

테스트되지 않았습니다.

+0

점수 테이블에 SUM이 없습니다. 팀마다 점수가 하나씩 있지만 각 티켓에는 4-5 개의 팀이 할당 될 수 있습니다. 내가 MySQL에서 고급 아니에요, 전에 실제로 JOINs를 사용한 적이 ... – user1866795

0

지금까지 잘되지 가장 우아한 쿼리 만이해야 단어 :

SELECT 
    tickets.id, 
    tickets.teamids, 
    sum(score) 
FROM 
    tickets left join scores 
    on concat(',', tickets.teamids, ',') like concat('%,', scores.teamid, ',%') 
WHERE tickets.week = 11 and concat(',', tickets.teamids, ',') like '%,150,%' 
GROUP BY tickets.id, tickets.teamids 

나이 :

SELECT 
    tickets.id, 
    tickets.teamids, 
    sum(score) 
FROM 
    tickets left join scores 
    on FIND_IN_SET(scores.teamid, tickets.teamids)>0 
WHERE tickets.week = 11 and FIND_IN_SET('150', tickets.teamids)>0 
GROUP BY tickets.id, tickets.teamids 

(이 question 더 많은 정보에 대한 답변을 참조).