我有两个 MySql 表,如下所示,其中显示了数据:

CREATE TABLE `A` (
`id` int(12) NOT NULL AUTO_INCREMENT,
`status` varchar(50) DEFAULT NULL,
`another_field` varchar(50) DEFAULT NULL
)

INSERT INTO `A` VALUES ('1', null, 'a');
INSERT INTO `A` VALUES ('2', null, 'b');
INSERT INTO `A` VALUES ('3', null, 'c');


CREATE TABLE `B` (
`id` int(12) NOT NULL AUTO_INCREMENT,
`status` varchar(50) DEFAULT NULL,
`tableA_id` int(12) DEFAULT NULL,
PRIMARY KEY (`id`)
)

INSERT INTO `B` VALUES ('1', 'aa', '1');
INSERT INTO `B` VALUES ('2', 'aa', '1');
INSERT INTO `B` VALUES ('3', 'aa', '2');
INSERT INTO `B` VALUES ('4', 'aa', '3');
INSERT INTO `B` VALUES ('5', 'bb', '3');

我想知道当 A.id = B.tableA_id 使用单个查询 时,如果所有 B.status 都相同,是否可以更新 A.status ?

这就是我希望我的表 A 的样子:

('1', 'aa', 'a') - 状态更新为 'aa',因为 B.id 1 和 2 具有相同的状态和相同的 B.tableA_id 值。
('2', 'aa', 'b') - 状态更新为 'aa',因为 B.id 3 具有相同的状态。
('3', null, 'c') - 这不会更新,因为 B.id 4 & 5 有不同的状态和相同的 table2.table1_id 值。

谢谢

最佳答案

UPDATE A
SET    status = COALESCE((
           SELECT MAX(B.status)
           FROM   B
           WHERE  B.tableA_id = A.id
           HAVING MAX(B.status) = MIN(B.status)
       ), A.status)

(注意:我添加了一个更正,您需要 COALESCE(..., A.status) 否则如果 B 中有多个状态,状态将设置为 NULL

关于sql - 编写此查询的最佳方式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2004868/

10-13 07:09