2012-07-21 4 views
42

를 사용하는 mysql 업데이트 쿼리 누구나 아래 쿼리에 잘못된 것이 있습니까? 내가 그것을 실행하면서브 쿼리

내가 얻을 :

# 1064 - 당신은 당신의 SQL 구문에 오류가 있습니다; 사용하는 올바른 구문 MySQL 서버 버전에 해당하는 설명서를 확인 'a.CompetitionID = Competition.CompetitionID a는 어디에'라인에서 8

근처
Update Competition 
Set Competition.NumberOfTeams = 
(
SELECT count(*) as NumberOfTeams 
FROM PicksPoints 
where UserCompetitionID is not NULL 
group by CompetitionID 
) a 
where a.CompetitionID = Competition.CompetitionID 

답변

113

주요 문제는 그 내부 쿼리 할 수 ​​없습니다 문에서 where 절과 관련이 있어야합니다. 왜냐하면 내부 하위 쿼리가 실행되기 전에 먼저 where 테이블이 업데이트되는 테이블에 적용되기 때문입니다. 이와 같은 상황을 처리하는 일반적인 방법은 multi-table update입니다.

Update 
    Competition as C 
    inner join (
    select CompetitionId, count(*) as NumberOfTeams 
    from PicksPoints as p 
    where UserCompetitionID is not NULL 
    group by CompetitionID 
) as A on C.CompetitionID = A.CompetitionID 
set C.NumberOfTeams = A.NumberOfTeams 

데모 : http://www.sqlfiddle.com/#!2/a74f3/1

+1

대단히 고마워, 그 속임수를했습니다 :) 물론, 환호를 감사합니다! – user1542043

+0

설명이 정말 좋은 대답이되었습니다. –

15

감사합니다, 나는 내부 조인과 UPDATE의 생각을하지 않았다.

원래 쿼리에서 값을 반환해야하므로 별칭을 지정할 수없는 하위 쿼리의 이름을 잘못 지정했습니다.

UPDATE Competition 
SET Competition.NumberOfTeams = 
(SELECT count(*) -- no column alias 
    FROM PicksPoints 
    WHERE UserCompetitionID is not NULL 
    -- put the join condition INSIDE the subquery : 
    AND CompetitionID = Competition.CompetitionID 
    group by CompetitionID 
) -- no table alias 

은 대회의 모든 기록에 대해 속임수를 써야합니다.

이 발견 될하려면

효과는 정확히없이 해당 PickPoints와 경쟁 레코드를 업데이트하지 않습니다 mellamokb에 의해 제안 된 쿼리와 동일하지 않습니다. SELECT id, COUNT(*) GROUP BY id 이후

은 레코드가 선택하지 않은 경우 SELECT COUNT(*) 반면

항상 0이되고, 값을 반환되며, ID의 기존 값 계산한다.

이것은 문제 일 수도 있고 아닐 수도 있습니다. mellamokb 쿼리의

0 인식 버전은 다음과 같습니다 해당하는 PickPoints이 발견되지 않은 경우 즉

Update Competition as C 
LEFT join (
    select CompetitionId, count(*) as NumberOfTeams 
    from PicksPoints as p 
    where UserCompetitionID is not NULL 
    group by CompetitionID 
) as A on C.CompetitionID = A.CompetitionID 
set C.NumberOfTeams = IFNULL(A.NumberOfTeams, 0) 

, 설정 Competition.NumberOfTeams 제로로. 참을성를 들어

4

:

최대로 감소 위와 @mellamokb의 대답은,이다
UPDATE target AS t 
INNER JOIN (
    SELECT s.id, COUNT(*) AS count 
    FROM source_grouped AS s 
    -- WHERE s.custom_condition IS (true) 
    GROUP BY s.id 
) AS aggregate ON aggregate.id = target.id 
SET t.count = aggregate.count 

.