복붙노트

[SQL] 서브 쿼리와 MySQL을 업데이트 쿼리

SQL

서브 쿼리와 MySQL을 업데이트 쿼리

사람이 쿼리 아래의 잘못이 무엇인지 볼 수 있을까요?

내가 그것을 실행하면 내가 얻을 :

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

해결법

  1. ==============================

    1.주요 문제는 어디 필터가 테이블 내부 하위 쿼리도가 ​​실행되기 전에 업데이트되고 먼저 적용되기 때문에 내부 쿼리가 외부 업데이트 문에 당신의 where 절과 관련이있을 수 없다는 것입니다. 이 같은 상황을 처리하는 일반적인 방법은 멀티 테이블 업데이트입니다.

    주요 문제는 어디 필터가 테이블 내부 하위 쿼리도가 ​​실행되기 전에 업데이트되고 먼저 적용되기 때문에 내부 쿼리가 외부 업데이트 문에 당신의 where 절과 관련이있을 수 없다는 것입니다. 이 같은 상황을 처리하는 일반적인 방법은 멀티 테이블 업데이트입니다.

    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

  2. ==============================

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

    감사합니다, 나는 내부 조인과 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 이후 ID BY COUNT (*)는 단지 GROUP ID의 기존 값 계산되며

    레코드가 선택하지 않은 경우 SELECT COUNT 반면 (*)는 항상 0이되고, 값을 반환한다.

    이것은, 또는하지 않을 수 있습니다, 당신을 위해 문제가있을 수 있습니다.

    mellamokb 쿼리의 0 인식 버전은 다음과 같습니다

    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)
    

    해당하는 PickPoints이 발견되지 않은 경우 즉, 제로로 Competition.NumberOfTeams을 설정합니다.

  3. ==============================

    3.참을성 경우 :

    참을성 경우 :

    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 = t.id
    SET t.count = aggregate.count
    

    mellamokb의 대답 @ 그의는, 위와 같이, 최대로 감소.

  4. from https://stackoverflow.com/questions/11588710/mysql-update-query-with-sub-query by cc-by-sa and MIT license