3
나는 다음과 같은 내용으로 두 테이블 players
및 stats
말해봐 :다른 조인/멀티 테이블 업데이트와 같은 쿼리에서 이전에 업데이트 된 열을 다르게 동작 액세스
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
5.7.17로 (https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html). –