문제

예제를 사용하여 설명하려고하는 일반적인 질문이 있습니다.

필드가있는 테이블이 있다고 가정 해

아이디어는 각각 단일 카테고리와 관련된 여러 항목이 있으며 여러 번 "나타납니다"라는 것입니다. 비율 필드에는 카테고리의 항목의 총 모양 수 중 각 항목의 모양의 백분율이 포함되어야합니다.

의사 코드에서 필요한 것은 다음과 같습니다.

  • 각 카테고리에 대해
    관련 항목에 대한 총 모양의 총합을 찾으십시오. 예를 들어 (예를 들어)select sum("appearances") from table group by category)

  • 각 항목에 대해
    비율 값을 항목의 외관을 위의 범주에 대해 찾은 합으로 나눈 값으로 설정합니다.

이제 단일 업데이트 쿼리로 이것을 달성하려고 노력하고 있지만 그렇게 할 수는 없습니다. 내가해야한다고 생각한 것은 다음과 같습니다.

update Table T    
set T.ratio = T.appearances /   
(    
select sum(S.appearances)    
from Table S    
where S.id = T.id    
)

그러나 MySQL은 업데이트 열에서 별칭 T를 수락하지 않으며이를 달성하는 다른 방법을 찾지 못했습니다.

어떤 아이디어?

도움이 되었습니까?

해결책

내가받은 두 가지 답변을 따라 (그 중 어느 것도 완료되지 않았기 때문에 내 자신을 썼습니다), 결국 내가 한 일은 다음과 같습니다.

UPDATE Table AS target
INNER JOIN 
(
select category, appearances_sum
from Table T inner join (
    select category as cat, sum(appearances) as appearances_sum
    from Table
    group by cat
) as agg
where T.category  = agg.cat
group by category
) as source
ON target.category = source.category
SET target.probability = target.appearances / source.appearances_sum 

매우 빨리 작동합니다. 나는 또한 상관 관계 서브 쿼리로 시도했지만 훨씬 느 렸습니다 (크기 순서). 그래서 나는 조인을 고수하고 있습니다.

다른 팁

업데이트 직후 조인 사용 :참조 설명서 - 13.2.11 업데이트 구문

따라서 Table1 Inner Join Table2 on .... set table1.foo = value where table2.bla = someothervalue

이런 종류의 것들로 항상 매뉴얼을 봅니다. MySQL은 적절한 참조 매뉴얼이 있으므로 올바른 구문을 얻는 것이 어렵지 않아야합니다.)

이것이 MSSQL에서 수행되는 방식입니다. MySQL은 동일하거나 유사하다고 생각합니다.

create table T (id int, ratio float, appearances int)
insert T values (1, null, 2)
insert T values (1, null, 3)

update T
set ratio = cast(appearances as float)/ agg.appearancesSum
from T join (
    select id, sum(appearances) as appearancesSum
    from T
    group by id
) as agg on t.id = agg.id
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top