2013-12-03 5 views
2

Кто-нибудь знает, можно ли перевести этот подзапрос в JOIN?Преобразуйте этот подзапрос в JOIN?

SELECT DISTINCT 

lastname, 
c.fullname, 

(SELECT COUNT(lg.action) FROM tbl_log AS lg WHERE lg.userid = u.id AND lg.course = c.id) AS 'Total Course Hits Per Student' 

FROM tbl_user AS u  
JOIN tbl_user_enrolments AS ents ON ents.userid = u.id  
JOIN tbl_enrol AS en ON ents.enrolid = en.id  
JOIN tbl_course AS C ON c.id = en.courseid  
JOIN tbl_context AS ctx ON c.id = ctx.instanceid  
JOIN tbl_role_assignments AS ra ON ra.contextid = ctx.id AND ra.userid = u.id  

LOG TABLE  

+-------------+---------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+-------------+---------------------+------+-----+---------+----------------+ 
| id   |      | NO | PRI | NULL | auto_increment | 
| time  |      | NO |  | NULL |    | 
| userid  |      | NO |  | NULL |    | 
| course  |      | NO |  | NULL |    | 
| action  |      | NO |  | NULL |    | 
+-------------+---------------------+------+-----+---------+----------------+ 

USER Table 

+--------------+---------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+--------------+---------------------+------+-----+---------+----------------+ 
| id   |      | NO | PRI | NULL | auto_increment | 
| username  |      | NO |  | NULL |    | 
| userpassword |      | NO |  | NULL |    | 
| lastname  |      | NO |  | NULL |    | 
| firstname |      | NO |  | NULL |    | 
+--------------+---------------------+------+-----+---------+----------------+ 

COURSE table 

+--------------+---------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+--------------+---------------------+------+-----+---------+----------------+ 
| id   |      | NO | PRI | NULL | auto_increment | 
| category  |      | NO |  | NULL |    | 
| fullname  |      | NO |  | NULL |    | 
| shortname |      | NO |  | NULL |    | 
+--------------+---------------------+------+-----+---------+----------------+ 

Я связываю пользователей вместе через таблицы регистрации и контекста.

ответ

0

Cant вы берете запрос на log_table

SELECT 
    COUNT(tbl_log.action) 
    lastname, 
    c.fullname, 
FROM tbl_log 
JOIN tbl_user ON tbl_log.userid = tbl_user.id 
JOIN tbl_course ON tbl_log.course = tbl_course.id 
GROUP BY tbl_log.userid, tbl_log.course 

Я не знаю, если вам нужны другие таблицы? Это даст счет, имя студента и название курса, если я не ошибаюсь. Тем не менее, вы получаете только фактические журналы, поэтому нет случайностей для студентов, которые ничего не сделали.

В противном случае на лог-столе может быть достаточно ВНЕШНЕГО СОЕДИНЕНИЯ. У меня нет времени проверять скрипт SQL. Надеюсь, это уже поможет вам немного по пути.

+0

Спасибо за вашу помощь. Я хотел бы определить действия ученика, даже если пользователи не выполнили никаких действий (ноль). В конечном счете, я хотел бы подсчитать наименьшее число действий за курс, даже если это ноль. Надеемся, что чтение, курс, минимальное количество действий. – user3061936

+0

Привет @luckylwk, ваш MySQL выглядит хорошо и отвечает на мой первоначальный вопрос. Я был расплывчатым в своем первом вопросе, если на курсе 20 человек, я пытаюсь найти ученика с самым низким уровнем использования. Следующий шаг - подсчитать наименьшее использование любого учащегося на курсе: 'code' SELECT u.lastname, c.fullname, MIN (COUNT (lg.action)) FROM tbl_log AS lg JOIN tbl_user AS u ON lg.userid = u.id JOIN tbl_course AS c ON lg.course = c.id GROUP BY lg.course, lg.userid 'code', но моя функция MIN() не будет работать. У меня есть недопустимое использование групповой функции. – user3061936

+0

Это не будет работать, потому что функция MIN вернет один ряд, а не bool, из которых MIN. Вы можете ЗАКАЗАТЬ ПО СЧЕТОМ (lg.action) ASC, который поместит минимальный счет в первую строку. – luckylwk

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