2016-03-03 2 views
0

Я хотел бы, чтобы заполнить свои таблицы tblRemarks, имеющий 6 столбцов имени, дату, замечания total_absents, remarks_information, разделКак заполнить все дни года только одним запросом?

У меня есть данные в моих столбцах, которые

NAME   DATE  TOTAL_ABSENTS  REMARKS REMARKS_INFORMATION  SECTION 

lemich 3/2/2016   5   absent   CUTTING CLASSES   3A 

pablo 3/2/2016   6   absent   CUTTING CLASSES   3A 

lemich 3/3/2016   5   ________   ___________   3A 

pablo 3/3/2016   6   ________   ___________   3A 

Я хочу, чтобы произвести вывод

NAME   DATE  TOTAL_ABSENTS  REMARKS REMARKS_INFORMATION  SECTION 

lemich 3/2/2016   5   absent   CUTTING CLASSES   3A 

pablo 3/2/2016   6   absent   CUTTING CLASSES   3A 

lemich 3/3/2016   5   ________   ___________   3A 

pablo 3/3/2016   6   ________   ___________   3A 

lemich 3/4/2016   5   ________   ___________   3A 

pablo 3/4/2016   6   ________   ___________   3A 

lemich 3/5/2016   5   ________   ___________   3A 

pablo 3/5/2016   6   ________   ___________   3A 

lemich 3/6/2016   5   ________   ___________   3A 

pablo 3/6/2016   6   ________   ___________   3A 
and so on.... 

Значение Я хотел бы сделать заявление о вставке, где я могу заполнить все дни года одним запросом.

примечание (замечания должны быть нулевым)

+0

Вы можете добавить пример того, как полученные данные должны выглядеть? –

ответ

1

записи вставить запрос, затем выберите этот запрос

SET @count := 0; 
SET @TOTAL_ABSENTS := 5; 
SET @REMARK := NULL; 
select CONCAT(@count := @count+1,'.', 'lemich') AS NAME, date_format(selected_date,'%m/%d/%Y') AS `DATE`, @TOTAL_ABSENTS AS TOTAL_ABSENTS, @REMARK AS REMARK from 
(select adddate('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) selected_date from 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0, 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1, 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2, 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3, 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v 
where selected_date between '2016-01-01' and '2016-12-31'; 

Это возвратить все дни 2016 года

SQLFiddle

+0

Что означает союз? можете ли вы кратко объяснить свои коды мне? –

+0

UNION используется для объединения результатов запроса 1 с другим. В этом случае он используется для получения 10 строк с номерами от 0 до 9 в них. это делается 5 раз (от t0 до t4), давая каждую комбинацию от 0 до 9 5 раз. Это используется для генерации списка чисел от 0 до 99999. Это число добавляется как дни до даты начала 1970/01/01, давая большой диапазон дат, тогда предложение WHERE используется для выбора единиц между ' 2016-01-01 'и' 2016-12-31 ', которые вас интересуют. – Kickstart

+0

Я просто задал свои вопросы. вы можете сделать это для меня? –

0

В зависимости от того, что вы хотите добавить (например, хотите заполнить оставшуюся часть года, год с последней даты и т. д.), то точные потребности меняются.

Это добавит 365 дней к строкам до последней даты для каждого имени. Значение раздела является случайным для каждого имени, но вы не указали, есть ли более одного имени, и если да, какой из них выбрать.

Не тестировался, но здесь вы идете

INSERT INTO tblRemarks(`name`, date, total_absents, remarks, remarks_information, section) 
SELECT sub_names.`name`, 
     DATE_ADD(sub_names.max_date, INTERVAL hundreds.i * 100 + tens.i * 10 + units.i + 1 DAY), 
     sub_names.total_absents, 
     NULL, 
     NULL, 
     a_section 
FROM 
(
    SELECT `name`, MAX(total_absents) AS total_absents, MAX(`date`) AS max_date, SUBSTRING_INDEX(GROUP_CONCAT(section), ',', 1) AS a_section 
    FROM tblRemarks 
    GROUP BY `name` 
) sub_names 
CROSS JOIN 
(
    SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 
) units 
CROSS JOIN 
(
    SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 
) tens 
CROSS JOIN 
(
    SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 
) hundreds 
WHERE hundreds.i * 100 + tens.i * 10 + units.i < 365 
+0

В моих данных я включил поле с разделом в нем. например, lemich (student_name) имеет раздел (3b), я хочу, чтобы остальная часть недавно вставленной таблицы имела лемич с разделом (3b) –

+0

Неизвестный столбец 'sub_names.name' в 'списке полей' –

+0

Возможно, потому что имя зарезервированное слово mysql (я избегаю использования имен столбцов, которые являются зарезервированными словами). Я отредактировал ответ, чтобы добавить тики вокруг имени поля. Можете ли вы опубликовать объявление своего фактического стола, чтобы у меня был шанс проверить его, пожалуйста? – Kickstart

Смежные вопросы