2013-08-22 6 views
0

Мне нужна помощь с запросом MySQL, с которым я боролся. Я уверен, что нетрудно понять, но я просто не вижу его.SUM столбца несколько раз MySQL

Мне нужно снова добавить один столбец, даже если он выполнил один раз и сохранил это значение и отобразил его в новом столбце рядом с ним?

В этом запросе отображаются две отдельные строки записей с столбцами «fcpd» и «CPDTotal», являющиеся основной частью этого вопроса. Первая строка записей с столбцом «CPDTotal» имеет значение 0,5, а вторая строка , Все, что мне нужно сделать, это взять 0,5 + 0,5, чтобы дать мне всего 1 и показать его в новом столбце после выполнения.

SELECT 
    mdl_user_info_data.data, 
    mdl_user.firstname, 
    mdl_user.lastname, 
    mdl_grade_grades.itemid, 
    mdl_grade_items.itemname, 
    mdl_user_info_data.id, 
    mdl_grade_grades.timecreated AS DATE, 
    mdl_quiz.fcpd, 
    SUM(mdl_quiz.fcpd) as CPDTotal 
    FROM mdl_grade_grades 

    INNER JOIN mdl_user ON mdl_grade_grades.userid = mdl_user.id 
    INNER JOIN mdl_grade_items ON mdl_grade_grades.itemid = mdl_grade_items.id 
    INNER JOIN mdl_quiz ON mdl_grade_items.itemname = mdl_quiz.name 
    INNER JOIN mdl_course ON mdl_grade_items.courseid = mdl_course.id 
    INNER JOIN mdl_user_info_data ON mdl_user.id = mdl_user_info_data.userid 


    WHERE mdl_user_info_data.fieldid = 1 
    AND mdl_grade_items.itemname IS NOT NULL 
    AND mdl_user.annualCPDReportActive = 'Y' 
    AND mdl_user.id = 1025 
    AND (mdl_course.category = 27) 
    GROUP BY mdl_user.firstname, 
    mdl_user.lastname, 
    mdl_user_info_data.data, 
    mdl_grade_items.itemname 

ответ

0

Вы можете добиться того, что в MySQL с помощью трюка - WITH ROLLUP:

SELECT 
mdl_user_info_data.data, 
mdl_user.firstname, 
mdl_user.lastname, 
mdl_grade_grades.itemid, 
mdl_grade_items.itemname, 
mdl_user_info_data.id, 
mdl_grade_grades.timecreated AS DATE, 
mdl_quiz.fcpd, 
SUM(mdl_quiz.fcpd) as CPDTotal 
FROM mdl_grade_grades 

INNER JOIN mdl_user ON mdl_grade_grades.userid = mdl_user.id 
INNER JOIN mdl_grade_items ON mdl_grade_grades.itemid = mdl_grade_items.id 
INNER JOIN mdl_quiz ON mdl_grade_items.itemname = mdl_quiz.name 
INNER JOIN mdl_course ON mdl_grade_items.courseid = mdl_course.id 
INNER JOIN mdl_user_info_data ON mdl_user.id = mdl_user_info_data.userid 


WHERE mdl_user_info_data.fieldid = 1 
AND mdl_grade_items.itemname IS NOT NULL 
AND mdl_user.annualCPDReportActive = 'Y' 
AND mdl_user.id = 1025 
AND (mdl_course.category = 27) 
GROUP BY mdl_user.firstname, 
mdl_user.lastname, 
mdl_user_info_data.data, 
mdl_grade_items.itemname 
WITH ROLLUP 

это не даст вам новый столбец, но ваш результат будет содержать соответствующие суммированные строки после каждой группы.

+0

Спасибо, это работает, однако он создает еще 3 записи NULL и производительность, я уже в колене. Все предложения по удалению дублированных записей? – mrAfzaL

+0

'NULL'-s будет для столбцов без группы. И они имеют очень мало влияния на всю производительность. –

+0

Удивительно, я буду играть с попыткой удалить записи NULL с COALESCE, но с учетом времени это то, что мне нужно. Спасибо! – mrAfzaL

0

Я могу понять это неправильно, но если значение не изменится, вы можете умножить его на 2, может быть?

+0

Спасибо, я это рассмотрел, но значение всегда меняется. – mrAfzaL

+0

Как они меняются? Я имею в виду, что если обновление, вставка или что-то произойдет, это будет так же, и между двумя запросами на вашем пути не будет задержки. Сервер не будет отвечать кому-либо другому, если он не завершит ваш запрос, поэтому я не уверен, но он, скорее всего, не изменится. – Kuzgun

+0

У нас есть внешняя сторона, которая будет в передней части системы (система OOP PHP), может на лету изменять информацию БД, поэтому мои запросы должны быть построены вокруг этого. Я понимаю, что вы говорите, я бы не опубликовал вопрос если бы я не покрыл все мои ресурсы. – mrAfzaL