2017-03-11 13 views
3

나는 다음과 같은 내용으로 두 테이블 playersstats 말해봐 :다른 조인/멀티 테이블 업데이트와 같은 쿼리에서 이전에 업데이트 된 열을 다르게 동작 액세스

mysql> select * from players; 
+----+-------+ 
| id | alive | 
+----+-------+ 
| 1 |  0 | 
| 2 |  1 | 
+----+-------+ 
mysql> select * from stats; 
+--------+------+------+-------+ 
| player | win | lose | ratio | 
+--------+------+------+-------+ 
|  1 | 12 | 20 | 0.6 | 
|  2 | 8 | 1 |  8 | 
+--------+------+------+-------+ 

을 그리고 증가 할 모든 플레이어의 win- 카운터를 업데이트하고 승패 비율을 업데이트합니다. 이것은 다음과 같이 보일 것입니다 : win의 증가 값이 ratio (: 1.8.2.2 UPDATE Differences 여기 MySQL의 설명서 상태 등)을 계산하는 데 사용되는

update `stats` set `win` = `win` + 1, `ratio` = `win`/`lose`; 

참고. 이제

업데이트 쿼리에 추가됩니다 가입 만 업데이트 플레이어로 제한하는 경우 alive = 1,이 동작 변경 : 내가 찾은 유일한 해결책은 새 값을 할당하는 것입니다

update `stats` st 
inner join `players` pl 
    on (pl.`id` = st.`player`) 
set `win` = `win` + 1, `ratio` = `win`/`lose` 
where pl.`alive` = 1; 

mysql> select * from stats; 
+--------+------+------+-------+ 
| player | win | lose | ratio | 
+--------+------+------+-------+ 
|  1 | 12 | 20 | 0.6 | 
|  2 | 9 | 1 |  8 | 
+--------+------+------+-------+ 

win의 임시 변수에 한 대신 ratio을 계산할 때 사용

update `stats` st 
inner join `players` pl 
    on (pl.`id` = st.`player`) 
set 
    `win` = @tmpWin := (`win` + 1), 
    `ratio` = @tmpWin/`lose` 
where pl.`alive` = 1; 

왜 MySQL은 그런 식으로 행동 않습니다 및 probl에 더 우아한 해결책이 이 종류의 (즉석에서 비율을 계산하기위한 뷰를 만드는 것 외에는)?

create table `players` (
    `id`  INT, 
    `alive`  TINYINT, 
    primary key (`id`) 
); 

create table `stats` (
    `player` INT, 
    `win`  INT, 
    `lose`  INT, 
    `ratio`  FLOAT, 
    primary key (`player`) 
); 

을 나는 참으로 이상한 보이는 조인 케이스의 행동을 설명 할 수 MySQL의 v5.7.17

+0

5.7.17로 (https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html). –

답변

1

를 사용하지만 다음 작품으로하고있어 다음과 같이

테이블은 생성 된 예상 : 당신이 [생성 된 컬럼]을 사용할 수 있습니다

UPDATE `stats` 
SET `win` = `win` + 1, `ratio` = `win`/`lose` 
WHERE player IN (SELECT id FROM players WHERE alive=1);