2012-05-26 2 views
-1

Я работаю над своим окончательным проектом, и это запрос, который возвращает список всех идентификаторов, имен и дней.Застрял с sql-запросом

select 
c.id as id, i.full_name as n, day as d 
from 
(instructors i 
inner join courses c ON c.instructor_id = i.id) 
inner join exam_schedules e ON c.id = e.course_id 

Результаты samlpe:

id name day 
9977 SCOTT, RAYMOND C. wednesday 
9467 FERNANDEZ, CYNTHIA E. wednesday 
9468 FERNANDEZ, CYNTHIA E. wednesday 
9493 FERNANDEZ, CYNTHIA E. wednesday 
9538 STEPHENS, RONNIE T. wednesday 
9539 MYERS, RONNIE Y. wednesday 
9554 GARRISON, EUGENE A. wednesday 

Как я могу получить список всех идентификаторов и количество комбинаций имени + день?

Пример выше, следует производить:

9977 1 
9467 3 
9468 3 
9493 3 
9538 1 
9539 1 
9554 1 
+0

Downvoter прокомментировал? – eggyal

ответ

1

Я использовал временную таблицу для ясности. Можно объединить это в один запрос, но это очень трудно сделать без реальной схемы:

CREATE TABLE tmp2 (id int, name_day varchar(80)); 

INSERT INTO tmp2 (id, name_day) (SELECT c.id AS id, CONCAT(i.full_name, i.day) AS name_day 
    FROM (instructors i 
     INNER JOIN courses c ON c.instructor_id = i.id) 
     INNER JOIN exam_schedules e ON c.id = e.course_id 
     ); 

SELECT id, counter FROM 
    (SELECT name_day, count(*) AS counter FROM tmp2 GROUP BY name_day) AS t1 
    INNER JOIN 
    tmp2 
    ON t1.name_day = tmp2.name_day; 

DROP TABLE tmp2; 
+0

, кажется, вычисляет, но цифры не являются правильными: \ – Andrew

+0

Я проверил ваши тестовые данные, начиная с (id, name, day) записей и на этот раз правильные цифры. –

0

Не зная вашей схемы, это трудно сказать наверняка, что является наиболее оптимальным запрос; но суть в том, что вам нужно вычислить подсчеты для каждого дня в подзапросе, а затем присоединить результат к вашим таблицам для получения желаемого результата. Например:

SELECT c.id, ctbl.total 
FROM  instructors AS i 
    JOIN courses  AS c ON c.instructor_id = i.id 
    JOIN exam_schedules AS e ON e.course_id  = c.id 
    JOIN (
    SELECT day 
     ,  COUNT(*) AS total 
    FROM  instructors AS i 
     JOIN courses  AS c ON c.instructor_id = i.id 
     JOIN exam_schedules AS e ON e.course_id  = c.id 
    GROUP BY day 
) AS ctbl USING (day) 
+0

ваш запрос выполняется, но итоговые значения огромны - вместо 1,2,3 или 4 это показывает как 160, 220, 190 и т. Д. – Andrew