2013-12-03 2 views
1

У меня возникли проблемы с запросом sql, если кто-то может мне помочь, будет блестящим. Итак, у меня есть студентов, участников, курсов, мест, student_to_courses этих таблиц. Мне нужно, чтобы все студенты в частности, конечно, и я делаю с этим запросомполя запросов запросов mysql

select 
    s.name as student_name, c.name as course_name, p.name as place_name 
from 
    student_to_courses s2c, 
    students_participation sp, 
    students s, 
    courses c, 
    places p 

where 
s.id = s2c.participation_id AND 
s.id = sp.profile_id AND 
c.id = s2c.course_id AND 
p.id = c.place_id = p.id AND 
s2c.course_id = 1 

Вот sqlfiddle

, но мне нужно, чтобы подсчитать, сколько раз студент был в определенном месте, что-то вроде этого student_name, имя_курса, имя_пользователя, | 3 |. Теперь я делаю это с другим запросом, который я вызываю каждый раз в моем цикле. Но мне было интересно, есть ли способ сделать это только с одним запросом. Спасибо заранее всем, кто хотел бы мне помочь.

ответ

1

Вы можете просто сделать COUNT() и затем GROUP BY остальных столбцов:

select s.name as student_name, 
     c.name as course_name, 
     p.name as place_name, 
     count(*) 
from students s 
inner join student_to_courses s2c on s.id = s2c.participation_id 
inner join courses c on c.id = s2c.course_id 
inner join places p on p.id = c.place_id 
inner join students_participation sp on s.id = sp.profile_id 
where s2c.course_id = 1 
group by s.name,c.name,p.name 

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

sqlfiddle demo

+0

ничего себе, что быстро, да это должно работать, но есть еще одна вещь, которую я забыл, что нужно добавить к моим подсчетам только те, кто уже закончил курс так, когда я добавить UNIX_TIMESTAMP (c.end) Alex

+0

Я не уверен, что понял, хотите ли вы присоединиться к левому или сохранить внутреннее соединение и считать только некоторые. Если это второй, попробуйте выполнить 'SUM (CASE WHEN unix_timestamp (c.end)

+0

что-то вроде этого, но не в slect http://sqlfiddle.com/#!2/6357b6/20 – Alex

0

Попробуйте это:

select 
    s.name as student_name, c.name as course_name, 
    p.name as place_name, count(*) qtd 
from 
    student_to_courses s2c, 
    students_participation sp, 
    students s, 
    courses c, 
    places p 
where 
    s.id = s2c.participation_id AND 
    s.id = sp.profile_id AND 
    c.id = s2c.course_id AND 
    p.id = c.place_id = p.id AND 
    s2c.course_id = 1 
group by s.name, c.name, p.name 

count(*) является AGGREGATE FUNCTION Смотрите эту ссылку, чтобы понять.

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