Про MySQL

Только написав запрос подобный этому, понимаешь все мощь 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

8 комментариев on "Про MySQL"

  1. Бы у меня похожий запрос 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 заменить на поля, которые пересчитывать при необходимости (добавление/удаление/изменени записей). На самом деле много зависит от размера таблиц, частоты запросов и критичности времени выполнения :)

  2. немного криво воткнулось, но суть понятна :)

  3. Чуток подправил.

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

    И, кстати, проблема с выбором одних и тех же данных решилась заменой

    UU.VALUE_ID = «1″

    на

    TR.STUDENT_ID = «1″

    в условии

  4. ну, так это вообще ошибка в логике была получается :)

  5. кстати, отображается все равно некорректно.
    на месте, где встречается «< ?» (без пробела) пропал код :)

  6. UU.VALUE_ID и TR.STUDENT_ID оба содержат ID юзера.

  7. Pet:

    Видать совсем глубоко в разработку ушел, давно нет постов… :)

Got something to say? Go for it!