2009-07-06 1 views
1

Ich habe eine Tabelle mit Bewertungen, die eine Benutzer-ID, Objekt-ID und eine Punktzahl (+1 oder -1) speichert. Jetzt, wenn ich eine Liste von Objekten mit ihren Gesamtpunktzahlen, der Anzahl von +1 Stimmen und der Anzahl von -1 Stimmen anzeigen möchte.Optimal Abfrage einer Datenbank von Bewertungen?

Wie kann ich dies effizient tun, ohne SELECT COUNT (*) FROM Bewertung WHERE (score = +/- 1 UND object_id = ..)? Das sind zwei Abfragen pro Objekt, was nicht akzeptabel ist. Ist das Datenbankdesign sinnvoll?

+0

Welche Datenbank? –

+0

Um das Design zu beurteilen, würden wir einige Anforderungen für das Design benötigen. Für die einfache Aufgabe ist das Design in Ordnung, weil es eine einfache Lösung gibt. –

+0

Es wird MySQL 5.1 verwenden. – PBJ

Antwort

1

Während es bezieht sich nicht auf Ihre Frage nach dem angemessenen Design, hier ist eine Abfrage, die Ihnen beiden Zählungen auf einmal bekommt:

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 

Vielleicht so ähnlich.

+0

(Sie brauchen object_id in der Auswahl auch.) –

+0

(Warum das ist. Danke, mein Herr. Dies wurde bearbeitet. Die richtige Antwort auf diese Frage hat es das erste Mal richtig und 48 Sekunden schneller als ich, wenn ich richtig aufrufen.) – glasnt

0

Dies sollte es tun:

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