他の表からの選択が空でない場合、別の表の選択された日付と一定の日付の空の場合に列を更新します。MySQLはselectを使用して列を更新し、else if
マイテーブル:
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
の最後の日付を選択します。 Messdiener
およびMesse
はDienst_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);
私は、次の更新ステートメントでこれを試してみたが、私がやりたいことされていません。MES.ID = 1
で
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 = ?;
私はこのため2017-07-11
でMessdiener.Letztes_dienen
を更新したいです最後の日付です。そして、MES.ID = 2
ととID = 2
とのMessdiener
はDienst_Messe -> Messe -> Messe_Tag
の日付がないので、私は2017-01-01
で更新したいと思います。
私の更新ステートメントは列を更新しますが、最新の日付は(2017-07-11)
でなく、最も古い日付の(2017-05-23)
です。 MT.Datum
が空の場合、文はMessdiener.Letztes_dienen
を2017-01-01
に更新します。
私は、最も古い日付の問題のために私の更新ステートメントにORDER BY
が必要だと思いますが、私はこれをどのように実装するのか分かりません。
ありがとうございました。
うわー、ありがとう、うまくいく! –
私は最大値が別の2つのテーブルにある可能性があるので、あなたのコードを修正しようとしました。 –