2009-07-06 2 views
1

У меня есть таблица оценок, в которой хранятся идентификатор пользователя, идентификатор объекта и оценка (+1 или -1). Теперь, когда я хочу отобразить список объектов с их итоговыми оценками, количество +1 голосов и количество -1 голосов.Оптимальный запрос к базе данных рейтингов?

Как я могу сделать это эффективно, не выполняя SELECT COUNT (*) FROM rating WHERE (оценка = +/- 1 AND object_id = ..)? Это два запроса на отображаемый объект, что неприемлемо. Является ли дизайн базы данных обоснованным?

+0

Что базы данных? –

+0

Чтобы судить о дизайне, нам понадобятся некоторые требования к дизайну. Для простой задачи под рукой дизайн прекрасен, потому что есть простое решение. –

+0

Он будет использовать MySQL 5.1. – PBJ

ответ

1

Хотя это не Ваш вопрос разумного дизайна, вот запрос, который получает вас оба счетчика сразу:

select 
    sum(case when score = 1 then 1 else 0 end) 'positive' 
, sum(case when score = -1 then 1 else 0 end) 'negative' 
, objectId 
from 
    ratings 
where 
    objectId = @objectId ... 
group by 
    objectId 
0
select object_id, 
     sum(case when score = 1 then 1 else 0) upvotes, 
     sum(case when score = -1 then -1 else 0) downvotes, 
     sum(score) 
from ratings 
group by object_id 

Может быть что-то подобное.

+0

(Вам тоже нужно object_id). –

+0

(Почему это так. Спасибо, добрый сэр. Это было отредактировано. Правильный ответ на этот вопрос получил правильность в первый раз и на 48 секунд быстрее меня, если я правильно помните.) – glasnt

0

Это следует сделать это:

SELECT 
    UserID, ObjectID, 
    SUM(CASE WHEN score=1 Then 1 Else 0 End) as UpVotes, 
    SUM(CASE WHEN score=-1 Then 1 Else 0 End) as DownVotes, 
FROM YourTable 
GROUP BY UserID, ObjectID 
Смежные вопросы