Про MySQL

12 августа 2008

Только написав запрос подобный этому, понимаешь все мощь MySQL :)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
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

Популярность: 13%

Понравилась заметка? Подписывайся на обновления блога!

Добавить в закладки:google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru
Категории: Интернет, Разработка Теги: ,
Смотрите также:

Комментарии
13 августа 2008

Бы у меня похожий запрос 4 года назад:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
	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 заменить на поля, которые пересчитывать при необходимости (добавление/удаление/изменени записей). На самом деле много зависит от размера таблиц, частоты запросов и критичности времени выполнения :)

пишет Alex_K
13 августа 2008

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

пишет Alex_K
13 августа 2008

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

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

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

UU.VALUE_ID = “1″

на

TR.STUDENT_ID = “1″

в условии

пишет Knave
14 августа 2008

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

пишет Alex_K
14 августа 2008

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

пишет Alex_K
15 августа 2008

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

пишет Knave
22 августа 2008

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

пишет Pet
27 августа 2008

Ага, ушел.

пишет Knave

RSS-лента комментариев к этой записи. TrackBack URI

Оставить комментарий

(обязательно)

(обязательно)


Спамер, осторожно! — спамить бесполезно!