2013-06-11 1 views
1

У меня есть a small Facebook card game, где пользователи могут оценивать друг друга.Рассчитать коэффициент в одной таблице и сохранить его в другой таблице

Эти рейтинги хранятся в таблице pref_rep PostgreSQL 8.4.13 как логическое значение nice, которое может быть нулевым тоже:

# \d pref_rep; 
             Table "public.pref_rep" 
    Column |   Type    |       Modifiers 
-----------+-----------------------------+----------------------------------------------------------- 
id  | character varying(32)  | not null 
author | character varying(32)  | not null 
nice  | boolean      | 
comment | character varying(256)  | 
rep_id | integer      | not null default nextval('pref_rep_rep_id_seq'::regclass) 
Indexes: 
    "pref_rep_pkey" PRIMARY KEY, btree (id, author) 
Check constraints: 
    "pref_rep_check" CHECK (id::text <> author::text) 
Foreign-key constraints: 
    "pref_rep_author_fkey" FOREIGN KEY (author) REFERENCES pref_users(id) ON DELETE CASCADE 
    "pref_rep_id_fkey" FOREIGN KEY (id) REFERENCES pref_users(id) ON DELETE CASCADE 

Я хотел бы, чтобы эти рейтинги видны в виде круговой диаграммы на пользовательских аватаров :

enter image description here

Так что я пытаюсь следующий -

Первый Селе кар фактор (хороший/хороший + не приятно) от pref_rep:

# select id, 
    (count(nullif(nice, false)) - count(nullif(nice, true)))/count(nice) as rating 
    from pref_rep 
    where nice is not null 
    group by id; 

      id   | rating 
-------------------------+-------- 
DE10072     |  -1 
DE10086     |  0 
DE10087     |  1 
DE10088     |  -1 
DE10095     |  0 
DE10097     |  1 
DE10105     |  0 

Почему не это напечатать 0-к-1 число с плавающей здесь?

И тогда я пытаюсь сохранить этот фактор в pref_users таблице - из соображений производительности я хочу сделать это каждую ночь cronjob:

# update pref_users u 
set rating = s.rating 
from (
     select 
     id, 
     count(nullif(nice, false)) - count(nullif(nice, true))/count(nice) as rating 
     from pref_rep 
     where nice is not null 
     group by id 
) s 
where u.id = s.id; 

UPDATE 25419 

Это быстро завершает, но почему все rating значения в pref_users установлены в null?

ответ

1

Оценка:

select id, 
    coalesce(
     (count(nice or null) - count(not nice or null))::float 
     /count(nice) 
    , 0) as rating 
from pref_rep 
group by id; 

count не считается аннулирует. true or null вернется true. false or null вернется null. Все это отлито для float, чтобы сделать возврат float.

Что касается того, почему ваше обновление дает только nulls, я не знаю. Поместите некоторые данные образца, чтобы мы могли играть с ним.

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

  • Нет связанных вопросов^_^