Выделение внутри оператора вставки - курсоры MySQL
Я попробовал некоторые, но я не мог найти решение, каким-то образом мне удалось получить этот результат.
Вот запрос:
DELIMITER ##
CREATE PROCEDURE test1(start_date DATE,end_date DATE)
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE a INT;
DECLARE present INT;
DECLARE total INT;
-- Declare the cursor
DECLARE id CURSOR
FOR
SELECT staff_id FROM ost_staff;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- Open the cursor
DROP TEMPORARY TABLE IF EXISTS reports;
CREATE TEMPORARY TABLE IF NOT EXISTS reports
(
staff_id INT(10),
present INT(10),
total INT(10)
);
OPEN id;
read_loop: LOOP
FETCH id INTO a;
IF done THEN
LEAVE read_loop;
END IF;
INSERT INTO reports(staff_id,present,total)
SELECT (COUNT(I.interval_start)) AS present, DATEDIFF(DATE_ADD(end_date,INTERVAL 1 DAY),start_date) AS total
FROM effort_frequency E
RIGHT OUTER JOIN time_intervals I ON I.interval_start = E.log_date
AND E.staffid=a AND E.log_date BETWEEN start_date AND end_date
LEFT OUTER JOIN ost_holidays H ON H.holiday_date = I.interval_start
WHERE DATE_FORMAT(I.interval_start,'%a') = 'Sun' OR H.holiday_date = I.interval_start OR E.total_effortspent IS NOT NULL;
-- Close the cursor
END LOOP;
CLOSE id;
END ##
Я получил следующий результат:
+----------+-----------------+
| staff_id | present | total |
+----------+---------+-------+
| (NULL) | 23 | 24 |
| (NULL) | 22 | 24 |
+----------+---------+-------+
Я получаю (NULL) для staff_id, Как я могу получить там staff_id? Я попытался использовать объявленную переменную 'a' в операторе вставки, но в то время я получил только staff_id, я не получил другие 2 поля, я не могу получить staff_id из оператора select in insert, потому что есть какая-то проблема.
Теперь мне нужно вставить staff_id из переменной 'a' во временную таблицу.
примечание: я действительно новичок в этой хранимой процедуре, но до сих пор как-то справился. Хорошо, если я получу некоторые подробности о том, как использовать команду "Выбрать внутри", включая решение для этого.
2 ответа
Попробуй это -
SELECT a, (COUNT(I.interval_start)) AS present, DATEDIFF(DATE_ADD(end_date,INTERVAL 1 DAY),start_date) AS total
Ваш INSERT
требует три поля, но ваш SELECT
Оператор выбирает только два: present
а также total
,
Пытаться:
SELECT E.staffid, (COUNT(I.interval_start))
AS present, DATEDIFF(DATE_ADD(end_date,INTERVAL 1 DAY),start_date) AS total