我在MySQL或数据库方面远非强大,所以我使用的是一个名为FlySpeed SQL Query的工具。这个工具帮助我以图形方式创建MySQL查询。 以下是我使用此工具创建的查询以及在互联网上的大量阅读。
Select
Employee.Firstname As Prénom,
Employee.Name As NOM,
TimeSheet.Filled As Validé,
TimeSheet.Closed As Clôturé,
Sum(Imputation.Hours) As `Somme des heures`,
TimeSheet.Month + 1 As Mois,
TimeSheet.Year As Année
From
Employee Inner Join
TimeSheet On TimeSheet.Employee_Id = Employee.Id Inner Join
Imputation On Imputation.TimeSheet_Id = TimeSheet.Id Inner Join
Project On Imputation.Project_Id = Project.Id
Where
TimeSheet.Filled = '1' And
(TimeSheet.Closed = '0' Or
TimeSheet.Closed Is Null) And
Imputation.Day <= Last_Day(Current_Date - Interval 1 Month) And Imputation.Day >= Date_Format(Current_Date - Interval 1 Month, '%Y-%m-01') And
Project.Id != '1'
Group By
Employee.Name, TimeSheet.Month + 1, TimeSheet.Year
Having
Sum(Imputation.Hours) >= 5 * ((DateDiff(Last_Day(Current_Date - Interval 1 Month), Date_Format(Current_Date - Interval 1 Month, '%Y-%m-01')) + 1))
Order By
Année,
Mois,
NOM
此查询返回了我想要的结果。保持与上述MySQL查询相同的条件,我想将Closed字段更新为“1”。我想在那里品尝一些东西:
-- UPDATE Query
--
UPDATE TimeSheet
SET Closed = '1'
--
-- UPDATE Query
From
Employee Inner Join
TimeSheet On TimeSheet.Employee_Id = Employee.Id Inner Join
Imputation On Imputation.TimeSheet_Id = TimeSheet.Id Inner Join
Project On Imputation.Project_Id = Project.Id
--
-- With those conditions
--
Where
TimeSheet.Filled = '1' And
(TimeSheet.Closed = '0' Or
TimeSheet.Closed Is Null) And
-- Calculating a time range
Imputation.Day <= Last_Day(Current_Date - Interval 1 Month) And Imputation.Day >= Date_Format(Current_Date - Interval 1 Month, '%Y-%m-01')
And
Project.Id != '1'
Group By
Employee.Name, TimeSheet.Month + 1, TimeSheet.Year
Having
-- Calculation : >= 5 times the number of days in the period
Sum(Imputation.Hours) >= 5 * ((DateDiff(Last_Day(Current_Date - Interval 1 Month), Date_Format(Current_Date - Interval 1 Month, '%Y-%m-01')) + 1))
---
-- With those conditions
所以我需要帮助才能将SELECT查询转换为UPDATE查询。请随时向我索取更多信息。
答案 0 :(得分:0)
尝试在set
:
joins
操作
UPDATE TimeSheet Inner Join
Employee On TimeSheet.Employee_Id = Employee.Id Inner Join
Imputation On Imputation.TimeSheet_Id = TimeSheet.Id Inner Join
Project On Imputation.Project_Id = Project.Id
--
-- With those conditions
--
SET TimeSheet.Closed = '1'
Where
TimeSheet.Filled = '1' And
(TimeSheet.Closed = '0' Or
TimeSheet.Closed Is Null) And
-- Calculating a time range
Imputation.Day <= Last_Day(Current_Date - Interval 1 Month) And Imputation.Day >= Date_Format(Current_Date - Interval 1 Month, '%Y-%m-01')
And
Project.Id != '1'
Group By
Employee.Name, TimeSheet.Month + 1, TimeSheet.Year
Having
-- Calculation : >= 5 times the number of days in the period
Sum(Imputation.Hours) >= 5 * ((DateDiff(Last_Day(Current_Date - Interval 1 Month), Date_Format(Current_Date - Interval 1 Month, '%Y-%m-01')) + 1))
---
答案 1 :(得分:0)
我终于找到了解决问题的方法。
这篇文章给了我很多帮助:http://www.codeproject.com/Tips/831164/MySQL-can-t-specify-target-table-for-update-in-FRO
这是:
UPDATE TimeSheet
SET
Closed = '1'
WHERE
TimeSheet.Id IN (SELECT
TimeSheet.Id
FROM
(SELECT
TimeSheet.Id
FROM
TimeSheet
Where
TimeSheet.Id IN (SELECT
TimeSheet.Id
FROM
Imputation
INNER JOIN TimeSheet ON Imputation.TimeSheet_Id = TimeSheet.Id
INNER JOIN Project ON Imputation.Project_Id = Project.Id
INNER JOIN Employee ON TimeSheet.Employee_Id = Employee.Id
Where
(TimeSheet.Closed = '0'
OR TimeSheet.Closed IS NULL)
AND TimeSheet.Filled = '1'
AND Imputation.Day <= Last_Day(Current_Date - INterval 1 Month)
AND Imputation.Day >= Date_Format(Current_Date - INterval 1 Month, '%Y-%m-01')
GROUP BY TimeSheet.Id
HAVING TimeSheet.Id NOT IN (SELECT DISTINCT
TimeSheet.Id
FROM
TimeSheet
INNER JOIN Imputation ON Imputation.TimeSheet_Id = TimeSheet.Id
INNER JOIN Project ON Imputation.Project_Id = Project.Id
INNER JOIN Employee ON TimeSheet.Employee_Id = Employee.Id
Where
Imputation.Day <= Last_Day(Current_Date - INterval 1 Month)
AND Imputation.Day >= Date_Format(Current_Date - INterval 1 Month, '%Y-%m-01')
AND Project.Id = '1')
AND Sum(Imputation.Hours) >= 5 * (DateDiff(Last_Day(Current_Date - INterval 1 Month), Date_Format(Current_Date - INterval 1 Month, '%Y-%m-01')) + 1))) VirtualTable01);
然而,术语&#34;解决方案&#34;也许有点强大。我会说更多它是一种解决方法。所以我不确定这个要求是否得到了很好的优化并且符合标准,但至少它有利于给我所需的结果。
与上述查询相同,但评论如下:
-- UPDATE Query
--
UPDATE TimeSheet
SET
Closed = '1'
--
-- UPDATE Query
--
-- With those conditions
--
WHERE
-- First Select
--
TimeSheet.Id IN (SELECT
TimeSheet.Id
FROM
-- Second Select
--
(SELECT
TimeSheet.Id
FROM
TimeSheet
Where
-- Third Select
--
TimeSheet.Id IN (SELECT
TimeSheet.Id
FROM
Imputation
INNER JOIN TimeSheet ON Imputation.TimeSheet_Id = TimeSheet.Id
INNER JOIN Project ON Imputation.Project_Id = Project.Id
INNER JOIN Employee ON TimeSheet.Employee_Id = Employee.Id
Where
(TimeSheet.Closed = '0'
OR TimeSheet.Closed IS NULL)
AND TimeSheet.Filled = '1'
AND Imputation.Day <= Last_Day(Current_Date - INterval 1 Month)
AND Imputation.Day >= Date_Format(Current_Date - INterval 1 Month, '%Y-%m-01')
GROUP BY TimeSheet.Id
-- Fourth Select
--
HAVING TimeSheet.Id NOT IN (SELECT DISTINCT
TimeSheet.Id
FROM
TimeSheet
INNER JOIN Imputation ON Imputation.TimeSheet_Id = TimeSheet.Id
INNER JOIN Project ON Imputation.Project_Id = Project.Id
INNER JOIN Employee ON TimeSheet.Employee_Id = Employee.Id
Where
Imputation.Day <= Last_Day(Current_Date - INterval 1 Month)
AND Imputation.Day >= Date_Format(Current_Date - INterval 1 Month, '%Y-%m-01')
AND Project.Id = '1')
--
-- End Fourth Select
AND Sum(Imputation.Hours) >= 5 * (DateDiff(Last_Day(Current_Date - INterval 1 Month), Date_Format(Current_Date - INterval 1 Month, '%Y-%m-01')) + 1))
--
-- End Third Select
) VirtualTable01)
--
-- End Second Select
--
-- End First Select
;