Только написав запрос подобный этому, понимаешь все мощь MySQL :)
SELECT T.ID AS TEST_ID,
T.NAME AS TEST_NAME,
C.ID AS COURSE_ID,
C.NAME AS COURSE_NAME,
GB.RESULT AS POINTS,
GB.MAX_RESULT AS MAX_POINTS,
ROUND(GB.RESULT / GB.MAX_RESULT * 100, 1) AS PERCENTS,
COUNT(DISTINCT TR.QUESTION_ID) AS QUESTIONS_COUNT,
COUNT(DISTINCT if(TR.CORRECT = "Y", TR.QUESTION_ID, NULL)) AS ANSWERS_CORRECT,
A.ID AS ATTEMPT_ID
FROM b_learn_test T
LEFT JOIN b_learn_course C ON C.ID = T.COURSE_ID
LEFT JOIN b_learn_test_permission TP ON TP.TEST_ID = T.ID
LEFT JOIN b_learn_test_scenario TS ON TS.TEST_ID = T.ID
LEFT JOIN b_uts_user UU ON UU.UF_POST = TP.USER_POST_ID
LEFT JOIN b_learn_gradebook GB ON T.ID = GB.TEST_ID
LEFT JOIN b_learn_attempt A ON T.ID = A.TEST_ID
LEFT JOIN b_learn_test_result TR ON A.ID = TR.ATTEMPT_ID
WHERE TP.PERMISSION = "R"
AND TR.STUDENT_ID = "1"
AND A.STATUS = "F"
GROUP BY TS.TEST_ID



Бы у меня похожий запрос 4 года назад:
if ( $mid ) {
# ищем по ID сообщения
$sth = $dbh->prepare("SELECT F.ID, F.NAME, F.DESCR, F.MESS_ORDER, F.MESS_PER_PAGE,
F.DATE_OF_CREATE, F.TOPIC_COUNT, F.MSG_COUNT FMSG_COUNT, F.URL, F.TIME_TO_EDIT, F.MAILING,
IF((T.DATE_OF_CREATE + INTERVAL F.TIME_TO_EDIT MINUTE) > NOW(), 1, 0), TEMPL.CONTENT, T.NAME, T.CONTENT, T.DATE_OF_CREATE,
T.UID, T.NICK, T.MSG_COUNT TMSG_COUNT, T.VIEWCOUNT,
T.STATUS, T.ID, COUNT(M.ID), F.REGISTRATION_REQUIRED, F.CAPTCHA_REQUIRED
FROM ((($tblForums F INNER JOIN $tblTopics T ON F.ID = T.FID)
INNER JOIN $tblTemplates TEMPL ON F.TEMPLATE2 = TEMPL.ID)
INNER JOIN $tblMessages M ON M.TOPID = T.ID)
INNER JOIN $tblMessages M2 ON M.TOPID = M2.TOPID
WHERE F.ENABLED = 'Y' AND M.ID = ? AND T.ENABLED = 'Y' AND M2.ID errstr;
$sth->execute($mid, $mid) or die $sth->errstr;
unless ( $sth->rows ) {
# нет нужного сообщения. Удалили, например
$mid = 0;
}
}
Как видишь, пришлось все COUNT заменить на поля, которые пересчитывать при необходимости (добавление/удаление/изменени записей). На самом деле много зависит от размера таблиц, частоты запросов и критичности времени выполнения :)
немного криво воткнулось, но суть понятна :)
Чуток подправил.
Я думаю для отчетов, как данных, запрашиваемых относительно нечасто и единовременно вариант с подсчетом данных в реальном времени более подходит.
И, кстати, проблема с выбором одних и тех же данных решилась заменой
UU.VALUE_ID = «1″
на
TR.STUDENT_ID = «1″
в условии
ну, так это вообще ошибка в логике была получается :)
кстати, отображается все равно некорректно.
на месте, где встречается «< ?» (без пробела) пропал код :)
UU.VALUE_ID и TR.STUDENT_ID оба содержат ID юзера.
Видать совсем глубоко в разработку ушел, давно нет постов… :)
Ага, ушел.