MySQL-基于多个表上的SELECT查询编写更新查询

MySQL-基于多个表上的SELECT查询编写更新查询,mysql,sql,sql-update,mysql-error-1064,Mysql,Sql,Sql Update,Mysql Error 1064,我在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)

我在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查询相同的条件,我想将封闭字段更新为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查询。请随时向我询问更多信息。

尝试在联接后移动集合操作:


我终于找到了解决我问题的办法

这篇文章对我帮助很大:

这是:

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
;

它不起作用了?假设您要更新返回的每个记录,乍一看似乎是可以的。当我按我的想法尝试查询时:错误1064 42000:您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解要使用的正确语法:第3行的“从员工内部加入时间表。员工\u Id=Employee.Id Inner”在使用之前,我已取消此处发布的查询的注释。当我尝试您的查询@sgedes:ERROR 1064 42000:您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解在第13行“Group By Employee.Name,TimeSheet.Month+1,TimeSheet.Year have SumI”附近使用的正确语法,因此,您的建议@sgedes似乎比我的建议更具吸引力。查询仅在第13行Group By处阻塞。在使用之前,我已经取消了此处发布的查询的注释。
-- 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
;