mysql - SQL 将值更新为另一个表中的值

标签 mysql sql sql-update

我有三个表,它们都可以通过某些 ID 连接,并且我需要根据其中一个表中已存在的值填充一个新列。

这是架构:

CREATE TABLE `users` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_attendance_code_group` int(11) DEFAULT '18',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

INSERT INTO users (user_attendance_code_group) VALUES 
  (1),
(1),
(3),
(2),
(2),
(2);

CREATE TABLE `attendance_time_index` (
  `time_index_id` int(11) NOT NULL AUTO_INCREMENT,
  `time_index_value` varchar(45) NOT NULL,
  `time_index_user_id` int(11) NOT NULL,
  `time_index_default` varchar(11) DEFAULT NULL,
  PRIMARY KEY (`time_index_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

INSERT INTO attendance_time_index (time_index_value, time_index_user_id) VALUES 
  ('AM', 3),
('PM', 3),
  ('AM', 4),
('PM', 4),
  ('AM', 5),
('PM', 5),
  ('AM', 6),
('PM', 6),
  ('AM', 7),
('PM', 7),
  ('AM', 8),
('PM', 8);

CREATE TABLE `attendance_code_groups` (
  `group_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `group_am_default` varchar(3) DEFAULT NULL,
  `group_pm_default` varchar(3) DEFAULT NULL,
  PRIMARY KEY (`group_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

INSERT INTO attendance_code_groups (group_am_default, group_pm_default) VALUES 
  ('A','B'),
('X','Y'),
  ('1','2');

我需要使用 group_am_defaultgroup_pm_default 中的值更新 time_index_default 列,具体取决于 time_index_value< 中的值是否存在(上午或下午)

这个更新查询是什么?

我尝试了以下方法,但子查询返回不止一行...

UPDATE attendance_time_index SET time_index_default = (
SELECT test FROM (SELECT CASE WHEN ati.time_index_value = 'PM' THEN acg.group_pm_default ELSE acg.group_am_default END AS test
FROM attendance_time_index ati
JOIN users u ON ati.time_index_user_id = u.user_id
JOIN attendance_code_groups acg ON u.user_attendance_code_group = acg.group_id) AS x) 

这里有一个 SQLFiddle 如果有帮助的话... http://sqlfiddle.com/#!2/1846e/4

最佳答案

UPDATE attendance_time_index ati 
JOIN users u ON ati.time_index_user_id = u.user_id
JOIN attendance_code_groups acg ON u.user_attendance_code_group = acg.group_id
SET ati.time_index_default = CASE WHEN ati.time_index_value = 'PM' THEN acg.group_pm_default ELSE acg.group_am_default END;

关于mysql - SQL 将值更新为另一个表中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25726943/

相关文章:

mysql - 数据库性能: how do more columns in a table impact design/development/performance

c# - 使用 IN 子句更新 SQL Server 中的多行

java - mysql 中的登录表单

mysql - 从按分钟计算的原始数据中按小时聚合 MySQL 数据

mysql - Mysql召唤订单总数

sql - PostgreSQL 链接表

python - "UPDATE"处或附近的 psycopg2 语法错误

sql - 计算由特定列分区的先前时间范围内的行

sql - H2,如何使用嵌套选择进行更新?

php - 从 mysql 搜索结果在 PHP 中的表中