我有两个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值。
由于
答案 0 :(得分:8)
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
答案 1 :(得分:0)
不确定MySql但在MSSQL中你可以编写类似的东西:
更新SET A.Status ='aa' 来自A.id = B.tableA_id的INNER JOIN B. 在哪里b.status ='aa'
它应该在MySQL中类似,但如果语言支持更新时加入,我就不会这样做。但我仍然希望它有所帮助。
答案 2 :(得分:0)
UPDATE a SET status =
(
SELECT status FROM b WHERE tableA_id = a.id LIMIT 0,1
)
WHERE id IN
(
SELECT tableA_id FROM b
GROUP BY tableA_id
HAVING COUNT(DISTINCT status) = 1
)
更新:罗兰是对的;我已经更新了查询,现在可以得到正确的结果。
答案 3 :(得分:-1)
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');