请考虑下trials表:
CREATE TABLE trials
(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name_A VARCHAR(6),
name_B VARCHAR(6),
score_A INT,
score_B INT);
Run Code Online (Sandbox Code Playgroud)
抽象地说,这代表了一系列试验,其中尝试了两种可能的东西,A和B. A和B各得一分.
后来我们增加两列winner和loser,两者相同的数据类型为name_A和name_B:
ALTER TABLE trials
ADD COLUMN winner VARCHAR(6),
ADD COLUMN loser VARCHAR(6);
Run Code Online (Sandbox Code Playgroud)
对于每个试验,我们希望填写winner与较高分数对应的任何名称.
例如,如果试用了
???????????????????????????????????????
? name_A ? name_B ? score_A ? score_B ?
???????????????????????????????????????
? alice ? bob ? 10 ? 5 ?
???????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
那个试验winner应该是alice.同样,在这种情况下loser应该填充bob:
????????????????????????????????????????????????????????
? name_A ? name_B ? score_A ? score_B ? winner ? loser ?
????????????????????????????????????????????????????????
? alice ? bob ? 10 ? 5 ? alice ? bob ?
????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
如何UPDATE正确设置表中的赢家和输家列trials?
尝试:
我考虑过使用子查询.这是一个查找赢家和输家的子查询:
SELECT id, name_A AS winner, name_B AS loser
FROM trials
WHERE score_A > score_B
UNION
SELECT id, name_B AS winner, name_A AS loser
FROM trials
WHERE score_B > score_A)
Run Code Online (Sandbox Code Playgroud)
为了获得胜利者,我做到了这一点:
UPDATE trials SET winner=(
SELECT id, winner from (
SELECT id, name_A AS winner
FROM trials
WHERE score_A > score_B
UNION
SELECT id, name_B AS winner
FROM trials
WHERE score_B > score_A) AS temp
)
WHERE temp.id = trials.id;
Run Code Online (Sandbox Code Playgroud)
但它不起作用,因为该字段temp.id未被识别.
小智 11
您可以在没有子查询的情况下创建它:
UPDATE test.trials AS t
SET t.winner=CASE WHEN t.score_A > t.score_B THEN t.name_A
WHEN t.score_A < t.score_B THEN t.name_B
ELSE NULL END,
t.loser=CASE WHEN t.score_A > t.score_B THEN t.name_B
WHEN t.score_A < t.score_B THEN t.name_A
ELSE NULL END;
Run Code Online (Sandbox Code Playgroud)
创建表格:
CREATE TABLE trials
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name_A VARCHAR(6),
name_B VARCHAR(6),
score_A INT,
score_B INT);
Run Code Online (Sandbox Code Playgroud)
空表:
SELECT * FROM test.trials;
Run Code Online (Sandbox Code Playgroud)
测试数据:
INSERT INTO test.trials (id, name_A, name_B, score_A, score_B) VALUES ('1', 'alice', 'bob', '10', '5');
INSERT INTO test.trials (id, name_A, name_B, score_A, score_B) VALUES ('2', 'onare', 'some', '5', '11');
SELECT * FROM test.trials;
+----+--------+--------+---------+---------+
| id | name_A | name_B | score_A | score_B |
+----+--------+--------+---------+---------+
| 1 | alice | bob | 10 | 5 |
| 2 | onare | some | 5 | 11 |
+----+--------+--------+---------+---------+
Run Code Online (Sandbox Code Playgroud)
添加winner和loser列:
ALTER TABLE test.trials
ADD COLUMN winner VARCHAR(10) NULL COMMENT '' AFTER score_B,
ADD COLUMN loser VARCHAR(10) NULL COMMENT '' AFTER winner;
SELECT * FROM test.trials;
+----+--------+--------+---------+---------+--------+-------+
| id | name_A | name_B | score_A | score_B | winner | loser |
+----+--------+--------+---------+---------+--------+-------+
| 1 | alice | bob | 10 | 5 | NULL | NULL |
| 2 | onare | some | 5 | 11 | NULL | NULL |
+----+--------+--------+---------+---------+--------+-------+
Run Code Online (Sandbox Code Playgroud)
运行查询:
UPDATE test.trials AS t
SET t.winner=CASE WHEN t.score_A > t.score_B THEN t.name_A
WHEN t.score_A < t.score_B THEN t.name_B
ELSE NULL END,
t.loser=CASE WHEN t.score_A > t.score_B THEN t.name_B
WHEN t.score_A < t.score_B THEN t.name_A
ELSE NULL END;
SELECT * FROM test.trials;
+----+--------+--------+---------+---------+--------+-------+
| id | name_A | name_B | score_A | score_B | winner | loser |
+----+--------+--------+---------+---------+--------+-------+
| 1 | alice | bob | 10 | 5 | alice | bob |
| 2 | onare | some | 5 | 11 | some | onare |
+----+--------+--------+---------+---------+--------+-------+
Run Code Online (Sandbox Code Playgroud)
你甚至可以使用IFon winner和loser.我用过,CASE因为如果score_A和之间有匹配score_B,你想要查询做什么?添加新列match.
小智 8
UPDATE Trials
SET Winner =
CASE
WHEN score_A > score_B THEN name_A
WHEN score_B > score_A THEN name_B
ELSE NULL
END
Run Code Online (Sandbox Code Playgroud)