Один запрос - агрегатные функции.

nut

Новичок
Один запрос - агрегатные функции.

Приветствую.

Есть таблица.

CREATE TABLE 't` (
`id` int(10) unsigned NOT NULL auto_increment,
`user_id` int(10) unsigned NOT NULL,
`mark` tinyint(4) NOT NULL default '0',
PRIMARY KEY USING BTREE (`id`),
KEY `Index_3` (`user_id`),
KEY `Index_6` (`mark`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Делаю запросик:
select
sum(`mark`) AS `total`,
user_id
from
`t`
where user_id=1
group by
user_id, mark

Он мне показывает в колонку все оценки этого пользователя.

Но мне нужно чтобы эти оценки показывались в строчках (Оценок всего две -1 и +1) что-то типа кармы.

Как сделать так, чтобы показывал колонки
sum(positive_mark), sum(negatove_mark), user_id.


Спасибо.
 

Gas

может по одной?
убери mark из group by и допиши условия на значение mark внутрь sum'ов
 

nut

Новичок
можно пример с условием внутри sum?

-~{}~ 16.09.09 16:49:

ЧЕРТ, не додумался до такого, спасибо. Уже сделал.

-~{}~ 16.09.09 16:58:

Так в догонку еще один вопрос. Я запрос оформлю как view, для более удобного доступа и reuse'a.

Насколько такие агрегатные функции тормозят в join`ах с другими таблицами. И не проще ли вешать триггер на реальную таблицу и ее присоединять, вместо динамического пересчета?
 

Gas

может по одной?
Насколько такие агрегатные функции тормозят в join`ах с другими таблицами. И не проще ли вешать триггер на реальную таблицу и ее присоединять, вместо динамического пересчета?
Всё зависит от данных, специфики проекта, ожидаемой нагрузки и т.д. Нельзя сказать - для этого абстрактного коня используй денормализацию, а тут хватит real-time пересчёта.

И лучше добавь составной ключ (user_id,mark), чтоб вся выборка велась только из индекса, а mark грохни, условий по нему у тебя скорее всего не будет, да и селективность у него никакая.
 
Сверху