Вставить строку в таблицу MySQL из запроса в одно поле, а функция SQL вернула значения в другие поля

Возможно ли в одном запросе вставить строку в таблицу 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 в строку в таблице month_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
  • Я немного исправил грамматику в заголовке (необходимо использовать множественное число для полей), а также запрос "запрос" в первой строке вопроса был исправлен для запроса. Спасибо!

Ответ 1

Ваш запрос неверен, потому что вы не использовали круглые скобки правильно. Когда вы используете 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.