2017-12-20 2 views
1

他の表からの選択が空でない場合、別の表の選択された日付と一定の日付の空の場合に列を更新します。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およびMesseDienst_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-11Messdiener.Letztes_dienenを更新したいです最後の日付です。そして、MES.ID = 2ととID = 2とのMessdienerDienst_Messe -> Messe -> Messe_Tagの日付がないので、私は2017-01-01で更新したいと思います。

私の更新ステートメントは列を更新しますが、最新の日付は(2017-07-11)でなく、最も古い日付の(2017-05-23)です。 MT.Datumが空の場合、文はMessdiener.Letztes_dienen2017-01-01に更新します。

私は、最も古い日付の問題のために私の更新ステートメントにORDER BYが必要だと思いますが、私はこれをどのように実装するのか分かりません。

ありがとうございました。

答えて

0
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` = ?; 
+0

うわー、ありがとう、うまくいく! –

+0

私は最大値が別の2つのテーブルにある可能性があるので、あなたのコードを修正しようとしました。 –

0

最大日付は3つの別のテーブルにある可能性があるため、コードを修正しようとしています。

UPDATE Messdiener SET Letztes_dienen = (
SELECT IFNULL(
(SELECT MAX(D.Datum) FROM (
SELECT MT.Datum Datum FROM Dienst_Messe DM 
LEFT JOIN Messe M ON M.ID = DM.Messe 
LEFT JOIN Messe_Tag MT ON MT.ID = M.Datum 
LEFT JOIN Messdiener ON DM.Messdiener = Messdiener.ID 
WHERE Messdiener.ID = ? 
UNION 
SELECT MT.Datum Datum FROM Weihrauch_Messe WM 
LEFT JOIN Messe M ON M.ID = WM.Messe 
LEFT JOIN Messe_Tag MT ON MT.ID = M.Datum 
LEFT JOIN Messdiener ON WM.Messdiener = Messdiener.ID 
WHERE Messdiener.ID = ? 
UNION 
SELECT MT.Datum Datum FROM Kreuz_Messe KM 
LEFT JOIN Messe M ON M.ID = KM.Messe 
LEFT JOIN Messe_Tag MT ON MT.ID = M.Datum 
LEFT JOIN Messdiener ON KM.Messdiener = Messdiener.ID 
WHERE Messdiener.ID = ? 
UNION 
SELECT MT.Datum Datum FROM Assistent_Messe AM 
LEFT JOIN Messe M ON M.ID = AM.Messe 
LEFT JOIN Messe_Tag MT ON MT.ID = M.Datum 
LEFT JOIN Messdiener ON AM.Messdiener = Messdiener.ID 
WHERE Messdiener.ID = ? 
) AS D) 
, '2017-01-01' 
) 
WHERE ID = ?; 

SELECT IFNULL(....) AS D), '2017-01-01');は、右の日付を返しますが、update句にその火エラー:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 27 

ライン27はWHERE ID = ?; なぜと最後の行のですか?手伝って頂けますか?私は、日付を持っているすべてのテーブルが含まれているview(W/Oの繰り返し)を使用することになり

UPDATE Messdiener SET Letztes_dienen = (
SELECT IFNULL(MAX(MT.Datum), '2017-01-01') 
FROM Messe_Tag MT 
LEFT JOIN Messe M ON M.Datum = MT.ID 
LEFT JOIN Dienst_Messe DM ON DM.Messe = M.ID 
LEFT JOIN Weihrauch_Messe WM ON WM.Messe = M.ID 
LEFT JOIN Kreuz_Messe KM ON KM.Messe = M.ID 
LEFT JOIN Assistent_Messe AM ON AM.Messe = M.ID 
WHERE DM.Messdiener = Messdiener.ID 
AND WM.Messdiener = Messdiener.ID 
AND KM.Messdiener = Messdiener.ID 
AND AM.Messdiener = Messdiener.ID 
) 
WHERE ID = 46; 

しかし、これは直'2017-01-01'

0

Letztes_dienenを設定します。

A antother私からしてみてくださいこのでした。

-- I assumed that the structure of the tables is the identical. 
CREATE VIEW all_data_view AS 
    (SELECT id, datum from Kreuz_Messe) UNION (SELECT id, datum FROM Messe); 

結果を確認クエリ:したがって

SELECT IFNULL(MAX(MT.Datum), '2017-01-01') FROM 
       `Dienst_Messe` DM 
    LEFT JOIN `all_data_view` AD ON AD.ID = DM.Messe 
    LEFT JOIN `Messe_Tag` MT ON MT.ID = AD.Datum 
WHERE DM . Messdiener = 1; 

、最初の答えからDMLを変更することで、あなたの目標を達成する(ビューall_data_viewとテーブルMesseを交換してください)。

関連する問題