在查询到一个字段的MySQL表结果中插入行,SQL函数将值返回到其他字段

时间:2017-01-20 15:48:37

标签: mysql function datetime

是否可以在一个查询中插入一行到MYSQL表中,还可以在其他字段中从MySQL函数返回的值?

例如,我有下表:

CREATE TABLE monthly_hours
(
  ProjectID int,
  Year int,
  Month int,
  monthTotalTime int
);
  • 显示特定年份某个月的项目工作时间。

我有一个查询总计花在项目上的总时间:

INSERT INTO time_monthly_hours ( `ProjectID`, `monthTotalTime` ) 
 SELECT jiraissue.PROJECT, SUM(worklog.timeworked) 
 FROM worklog, jiraissue 
 WHERE worklog.issueid = jiraissue.ID 
  AND jiraissue.PROJECT = 13262 
  AND worklog.startdate BETWEEN '2017-01-01 00:00:00' AND '2017-01-18 23:59:59';

我想将projectID和monthTotalTime插入到monthly_hours表的一行中,包含月份和年份。

我试过了:

INSERT INTO time_monthly_hours ( ProjectID, monthTotalTime,  Year, Month ) VALUES
( 
 SELECT jiraissue.PROJECT, SUM(worklog.timeworked) 
 FROM worklog, jiraissue 
 WHERE worklog.issueid = jiraissue.ID 
  AND jiraissue.PROJECT = 13262 
  AND worklog.startdate BETWEEN '2017-01-01 00:00:00' AND '2017-01-18 23:59:59' 
), 
  MONTH(CURRENT_DATE()), YEAR(CURRENT_YEAR() );

但这是一个无效的查询。我已经搜索了很多但是无法找到这样的解决方案来同时将SQL查询结果和SQL函数中的值放入一行。

请你指教。我需要在MySQL级别执行此操作,而不是通过更高级别的工具。谢谢。

演示更新:

(问题内容保持不变)

  • 我尝试根据BeNice的要求增强格式,使其更具可读性
  • 我稍微纠正了标题中的语法(需要对字段使用复数),并且#34; queryto"在第一行问题被纠正以查询。谢谢!

1 个答案:

答案 0 :(得分:2)

您的查询无效,因为您没有正确使用括号。使用INSERT...VALUES()时,语法必须为:

INSERT INTO <table> (col, col, col, col) VALUES (val, val, val, val);

但是你基本上有无效的语法,比如:

INSERT INTO <table> (col, col, col, col) VALUES (val, val), val, val;

使用一个返回两列的子查询还有另一个问题。不能用它来代替INSERT语句的标量值。

此外,您将MONTH()表达式与Year列匹配,将YEAR()表达式与Month列匹配。

但它比你制作它更简单。您可以将常量表达式放入SELECT中,因此SELECT有四列。

INSERT INTO time_monthly_hours ( ProjectID, monthTotalTime,  Year, Month )     
 SELECT jiraissue.PROJECT, SUM(worklog.timeworked),
  YEAR(CURRENT_DATE()), MONTH(CURRENT_DATE())
 FROM worklog, jiraissue 
 WHERE worklog.issueid = jiraissue.ID 
  AND jiraissue.PROJECT = 13262 
  AND worklog.startdate BETWEEN '2017-01-01 00:00:00' AND '2017-01-18 23:59:59' 

当您使用INSERT...SELECT时,您不需要VALUES关键字。