Запрос из 2 таблиц
343
0
Есть 2 таблицы
Должно получиться что-то вроде этого
Как видно из вывода светы нет связи вообще, а у пети только за сентябрь есть
но нужно вывести за оба месяца
Добавлено через 01:56 сек.
Я сделал подобный запрос, но не знаю как вывести все месяцы даже если нет связи
CREATE TABLE student ( id int(10) NOT NULL AUTO_INCREMENT, name varchar(50) BINARY DEFAULT NULL, status tinyint(4) DEFAULT NULL, PRIMARY KEY (id) ); INSERT INTO `student` (`name`, `status`) VALUES ('Вася', '1') INSERT INTO `student` (`name`, `status`) VALUES ('Петя', '1'); INSERT INTO `student` (`name`, `status`) VALUES ('Коля', '1'); INSERT INTO `student` (`name`, `status`) VALUES ('Света', '1'); CREATE TABLE grade ( id int(11) NOT NULL AUTO_INCREMENT, student_id int(11) NOT NULL, date datetime NOT NULL, grade enum('1','2','3','4','5') NOT NULL, PRIMARY KEY (id) ); INSERT INTO `grade` (`student_id`, `date`, `grade`) VALUES ('1', '2013-09-04 10:10:10', '5'); INSERT INTO `grade` (`student_id`, `date`, `grade`) VALUES ('1', '2013-09-04 10:10:10', '4'); INSERT INTO `grade` (`student_id`, `date`, `grade`) VALUES ('2', '2013-09-04 10:10:10', '3'); INSERT INTO `grade` (`student_id`, `date`, `grade`) VALUES ('2', '2013-09-04 10:10:10', '4'); INSERT INTO `grade` (`student_id`, `date`, `grade`) VALUES ('1', '2013-10-04 10:10:10', '3'); INSERT INTO `grade` (`student_id`, `date`, `grade`) VALUES ('3', '2013-09-04 10:10:10', '5'); INSERT INTO `grade` (`student_id`, `date`, `grade`) VALUES ('3', '2013-10-04 10:10:10', '3'); INSERT INTO `grade` (`student_id`, `date`, `grade`) VALUES ('3', '2013-09-04 10:10:10', '3');
Должно получиться что-то вроде этого
'Вася', '2013-09', '4.5' 'Вася', '2013-10', '3' 'Коля', '2013-09', '4' 'Коля', '2013-10', '3' 'Петя', '2013-09', '3.5' 'Петя', '2013-10', '---' 'Света', '2013-09', '---' 'Света', '2013-10', '---'
Как видно из вывода светы нет связи вообще, а у пети только за сентябрь есть
но нужно вывести за оба месяца
Добавлено через 01:56 сек.
Я сделал подобный запрос, но не знаю как вывести все месяцы даже если нет связи
SELECT s.name, DATE_FORMAT(g.date, '%Y-%m') ym, CAST(IFNULL(AVG(g.grade), '---') AS CHAR(3)) FROM student s LEFT JOIN grade g ON s.id = g.student_id GROUP BY s.name, ym;
Изменил: Вантуз-мен (01.07.2016 / 01:31)
0
Он выводит так
'Вася', '2013-09', '4.5' 'Вася', '2013-10', '3' 'Коля', '2013-09', '4' 'Коля', '2013-10', '3' 'Петя', '2013-09', '3.5' 'Света', NULL, '---'
0
Vantuz, необходимо сформировать еще одно множетсво:
Добавлено через 09:27 сек.
Пример нарно нерабочий, но может направит на верный путь.
select student.name, DATE_FORMAT(dates.date, '%Y-%m') ym, CAST(IFNULL(AVG(grade.grade), '---') AS CHAR(3)) from student left join (select date from grade group by date) as dates on 1 = 1 LEFT JOIN grade ON student.id = grade.student_id group by student.name, dates.date
Добавлено через 09:27 сек.
Пример нарно нерабочий, но может направит на верный путь.
0
Башка, ага спасибо вот так работает
SELECT student.name, DATE_FORMAT(dates.date, '%Y-%m') ym, CAST(IFNULL(AVG(grade.grade), '---') AS CHAR(3)) FROM student LEFT JOIN (select date from grade group by date) dates ON 1 = 1 LEFT JOIN grade ON student.id = grade.student_id and DATE_FORMAT(grade.`date`, '%Y-%m') = DATE_FORMAT(dates.`date`, '%Y-%m') GROUP BY student.name, dates.date;
0
Башка, я там немного ошибся, группировка сработала потому что все даты одинаковые
правильнее все же та
правильнее все же та
SELECT s.name, ym, CAST(IFNULL(AVG(g.grade), '---') AS CHAR(3)) FROM student s LEFT JOIN (select DATE_FORMAT(date, '%Y-%m') ym from grade group by ym) d ON 1 = 1 LEFT JOIN grade g ON s.id = g.student_id and DATE_FORMAT(g.`date`, '%Y-%m') = ym GROUP BY s.name, ym;
Для выполнения действия необходимо авторизоваться!