2012-02-28 3 views
1

Я вытягиваю группировку типов комментариев и их итогов из базы данных mySQL. Результирующий набор выглядит следующим образом:Как эффективно группировать, суммировать и сортировать этот результат mysql?

ID - NAME - TOTAL
0 - Общее - 4
3 - ЗАТРОНУЛИ - 9
4 - MISC - 5

В моем выходе к концу пользователь, однако, я хочу суммировать итоговые значения для GENERAL и MISC, ID 0 и 4. Как я должен эффективно это делать? Проблема, которую я вижу, заключается в том, что идентификатор 0 может отсутствовать в каждом результате и то же самое для ID 4.

Любые предложения?

Мой запроса:

SELECT a.fk_type_id as ID, count(a.fk_type_id) as TOTAL, b.vch_name as NAME 
FROM comments a 
LEFT JOIN comments_types b ON a.fk_type_id = b.id 
WHERE a.entry = X 
GROUP BY a.fk_type_id 

Так что мой результат конечного пользователя должен выглядеть следующим образом:

ОБЩИЕ/MISC - 9
ЗАТРОНУЛИ - 9

+0

Каков запрос, который производит это? –

+0

Если в строке результатов не exixst, то TOTAL равно 0. Или вы хотите что-то другое? – Narek

ответ

1

Я хотел бы сделать это легко на вас и MySQL и разделить его так:

(SELECT a.fk_type_id as ID, COUNT(a.fk_type_id) as TOTAL, b.vch_name as NAME 
FROM comments a 
JOIN comments_types b ON a.fk_type_id = b.id 
WHERE a.entry = X AND a.fk_type_id <> 0 AND a.fk_type_id <> 4 
GROUP BY a.fk_type_id) 
UNION ALL 
(SELECT a.fk_type_id as ID, COUNT(a.fk_type_id) as TOTAL, 'GENERAL/MISC' as NAME 
FROM comments a 
JOIN comments_types b ON a.fk_type_id = b.id 
WHERE a.entry = X AND (a.fk_type_id = 0 OR a.fk_type_id = 4) 
GROUP BY a.fk_type_id) 

Я изменил свой LEFT JOIN к JOIN потому, что мы только рассчитываем комментарии с типом.

Вы могли бы улучшить этот запрос, предполагая, что индекс по fk_type_id, делая «MISC» типа «1» вместо типа «4», так что вы могли бы сделать что-то вроде a.fk_type_id < 2 вместо (a.fk_type_id = 0 OR a.fk_type_id = 4) и a.fk_type_id > 1 вместо a.fk_type_id <> 0 AND a.fk_type_id <> 4.

Если вы используете индексы вместо сканирования строк, выполнение двух отдельных запросов, которые возвращают разные результаты, не повлияет на производительность.

0

Это подведет множественные записи ОБЩЕГО и MISC

SELECT SUM(TOTAL) FROM tablename WHERE NAME='GENERAL' OR NAME='MISC'; 
+0

Но мне также нужны другие потенциальные идентификаторы. Итак, в приведенном выше примере мой конечный пользователь может увидеть GENERAL/MISC-9, MEANINGFUL - 9 – Mike

+1

@Mike, то почему бы вам не сделать свой первоначальный запрос и не добавить общие и разные итоги? – Brian

2

Попробуйте этот запрос -

SELECT 
    IF(name = 'GENERAL' OR name = 'MISC', 'GENERAL/MISC', name) new_name 
    , SUM(total) 
FROM 
    comments 
GROUP BY 
    new_name 

Вы можете написать настраиваемое поле new_name.

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