MySQL 使用 select 和 if else 更新列

标签 mysql sql select

我想更新一列,当从另一个表中选择的内容不为空时,使用另一个表中的选定日期,当它为空时具有恒定日期。

我的表:

CREATE TABLE Messe_Tag (
ID integer NOT NULL AUTO_INCREMENT,
Datum date NOT NULL,
PRIMARY KEY (ID)
);

CREATE TABLE Messdiener (
ID integer NOT NULL AUTO_INCREMENT,
Name varchar(50) NOT NULL,
Letztes_dienen date DEFAULT '2017-01-01',
PRIMARY KEY (ID),
);

CREATE TABLE Messe (
ID integer NOT NULL AUTO_INCREMENT,
Datum integer NOT NULL,
PRIMARY KEY(ID),
FOREIGN KEY (Datum) REFERENCES Messe_Tag(ID)
);

CREATE TABLE Dienst_Messe (
ID integer NOT NULL AUTO_INCREMENT,
Messdiener integer,
Messe integer NOT NULL,
PRIMARY KEY (ID),
FOREIGN KEY (Messdiener) REFERENCES Messdiener(ID),
FOREIGN KEY (Messe) REFERENCES Messe(ID)
);

我想从 Messdiener 中选择 Messe 的最后一个日期。 MessdienerMesseDienst_Messe 相关,Messe 的日期与 Messe_Tag 相关>。当选择返回空结果时,我想用常量日期 '2017-01-01' 更新 Messdiener.Letztes_dienen。当选择返回一个日期时,我想用那个日期更新。

表格的示例数据:

INSERT INTO Messe_Tag(ID,Datum)VALUES(1,'2017-07-11');
INSERT INTO Messe_Tag(ID,Datum)VALUES(2,'2017-05-23');

INSERT INTO Messdiener(ID,Name)VALUES(1,'Basti');
INSERT INTO Messdiener(ID,Name)VALUES(2,'Alex');

INSERT INTO Messe(ID,Datum)VALUES(1,1);
INSERT INTO Messe(ID,Datum)VALUES(2,2);

INSERT INTO Dienst_Messe(ID,Messdiener,Messe)VALUES(1,1,1);
INSERT INTO Dienst_Messe(ID,Messdiener,Messe)VALUES(1,1,2);

我尝试使用以下更新语句进行此操作,但没有按照我的意愿进行:

UPDATE Messdiener MES
LEFT JOIN Dienst_Messe DM ON DM.Messdiener = MES.ID
LEFT JOIN Messe M ON M.ID = DM.Messe
LEFT JOIN Messe_Tag MT ON MT.ID = M.Datum
SET MES.Letztes_dienen = CASE
WHEN MT.Datum IS NOT NULL
THEN MT.Datum
ELSE '2017-01-01' END
WHERE MES.ID = ?;

MES.ID = 1 我想用 2017-07-11 更新 Messdiener.Letztes_dienen 因为这是最后一个日期。对于 MES.ID = 2,我想使用 2017-01-01 进行更新,因为 Messdiener ID = 2 > 在 Dienst_Messe -> Messe -> Messe_Tag 中没有日期。

我的更新语句更新了列,但不是使用最新日期 (2017-07-11),而是使用最旧日期 (2017-05-23)。如果 MT.Datum 为空,则语句将列 Messdiener.Letztes_dienen 成功更新为 2017-01-01

我认为我的更新语句中需要一个 ORDER BY 来解决最早日期的问题,但我不知道如何实现它。

感谢您的帮助。

最佳答案

UPDATE `Messdiener` SET `letztes_dienen` = (
    SELECT IFNULL(MAX(MT.Datum), '2017-01-01') FROM 
                  `Dienst_Messe` DM 
        LEFT JOIN `Messe`     M  ON M.ID  = DM.Messe
        LEFT JOIN `Messe_Tag` MT ON MT.ID = M.Datum 
    WHERE DM.Messdiener = Messdiener.ID
)
WHERE `id` = ?;

关于MySQL 使用 select 和 if else 更新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47907650/

相关文章:

php - 使用 PHP 导出到 CSV 文件

php - 需要显示按日期排序但按周分隔的mysql表

mysql - 我能否仅在更新的行不存在时更新一组行?

mysql - 如何在mysql中显示具有多个音乐流派类别的专辑?

mysql - 配置 MySQL 返回警告行

mysql游标循环选择

mysql - Tstamp Interval 始终在午夜开始

php - PDO 从数据库中获取数据

javascript - 如何使用 JavaScript 选择多个类之一?

mysql - 如何从mysql数据库表中选择可用的IP地址