2015-02-11 55 views
0

我在MySQL或数据库方面还不够强大,所以我使用了一个名为FlySpeed SQL Query的工具。这个工具帮助我以图形方式创建MySQL查询。 这是我用这个工具创建的查询和大量的在互联网上阅读。MySQL - 在多个表上编写基于SELECT查询的UPDATE查询

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

而且它不工作?第一眼看起来确定,假设你想更新每个返回的记录。 – LCIII 2015-02-11 15:45:53

+0

当我按照我的想法尝试查询时:'ERROR 1064(42000):你的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在第3行的'From Employee Inner Join TimeSheet On TimeSheet.Employee_Id = Employee.Id Inner'附近使用正确的语法(我已取消注释在使用前在此处发布的查询)。 – axsoverflow 2015-02-13 13:59:28

回答

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); 

然而,术语 “溶液” 也许是有点强。我会说更多这是一个解决方法。所以我不确定这个请求是否被优化并且符合标准,但是至少它能够给我想要的结果。

同上查询,但评论说:

-- 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 
; 
0

尝试joins后移动set操作:

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)) 
    --- 
+0

当我尝试你的查询@sgeddes: '错误1064(42000):你的SQL语法错误;检查对应于您的MySQL服务器版本的手册,以便在'Group By Employee.Name,TimeSheet.Month + 1,TimeSheet.Year '附近使用正确的语法。使用 总和(I'在第13行' 因此,您的提案@sgeddes似乎比我的参与程度更高,查询只在第13行“Group By”处被阻止(我已经取消注释在此之前发布的查询)。 – axsoverflow 2015-02-13 13:58:56