2016-07-14 10 views
1

Ich habe eine Zwischentabelle namens ratingsPerId, die von einer gespeicherten Prozedur hier gezeigt hergestellt:Zählen übereinstimmenden Bewertungen nach ID ohne Verwendung von Tabellen Joins? Ist es möglich? MySQL?

wollen
Id Rating 
'1', 'low' 
'1', 'low' 
'1', 'low' 
'1', 'low' 
'1', 'low' 
'2', 'medium' 
'2', 'medium' 
'2', 'medium' 
'2', 'high' 
'2', 'high' 
'4', 'high' 
'4', 'high' 
'4', 'high' 
'4', 'high' 
'4', 'high' 
'9', 'high' 
'9', 'high' 
'9', 'high' 
'9', 'high' 
'9', 'high' 
'9', 'high' 
'9', 'high' 
'9', 'high' 
'9', 'high' 

Was ich für Id 1, zählen alle Tiefen, Medien, Höhen ist. Und das gleiche für alle folgenden Id 2, 4, 9, etc ...

Gerade jetzt, was ich habe, ist ein Tisch kommen, dass zählt die Hochs und Tiefs pro ID:

drop temporary table if exists t1, t2; 
create temporary table t1(ruleid int, high INT); 
INSERT into t1(
    SELECT ruleid, count(*) AS High from ratingsPerRuleId WHERE rating='high' group by ruleid); 
create temporary table t2(ruleid int, low int); 
INSERT into t2(
    SELECT ruleid, count(*) AS Low from ratingsPerRuleId WHERE rating='low' group by ruleid); 

SELECT t1.RuleID, t1.high, t2.low from t1 left join t2 on t1.ruleid=t2.ruleid ; 

ID High Low 
1 NULL 5 
2  2 NULL 
4  5 NULL 
9  9 NULL 

Wie Sie kann ich sehen, ich muss eine dritte Tabelle für Medium erstellen und einen Join von diesem ausführen, um die Medium-Spalte zu erhalten.

Gibt es eine einfachere Möglichkeit, dies in MYSQL zu tun? Ich habe das Gefühl, dass es eine einfache Aussage gibt, die dies bewerkstelligen kann, und meine chaotischen Tabellenverbindungen von kleinen Tabellen sind nicht notwendig, aber ich weiß nicht genug von MySQL, um die Antwort zu bekommen.

Ich schaute in Count (distinct) und Select Distinct, aber habe nicht die Antwort gefunden.

Danke!

+0

Mögen Sie diese führen wollen: für jede ID Gesamt Hoch, Medium-Gesamt und insgesamt niedrige Zahl? – 1000111

+0

ja! Ich will das Ergebnis einfach so – truffle

Antwort

1

Ich denke, Sie müssen CASE WHEN Ausdruck verwenden.

SELECT 
Id, 
COUNT(CASE WHEN Rating ='high' THEN 1 END) AS high, 
COUNT(CASE WHEN Rating ='medium' THEN 1 END) AS medium, 
COUNT(CASE WHEN Rating ='low' THEN 1 END) AS low 
FROM your_table 
GROUP BY Id; 

Working Demo

ODER Sie SUM zusammen mit MySQL boolean expression verwenden können, wenn Sie nicht verwenden CASE WHEN wollen.

SELECT 
Id, 
SUM(Rating ='high') AS high, 
SUM(Rating ='medium') AS medium, 
SUM(Rating ='low') AS low 
FROM your_table 
GROUP BY Id; 

Working Demo

Anmerkung:SELECT SUM(a=b) returns 1 only if a=b;

NB:Die folgenden Beispieleingabe wird in den Arbeits demos verwendet

| Id | Rating | 
|----|--------| 
| 1 | low | 
| 1 | low | 
| 1 | medium | 
| 1 | high | 
| 2 | high | 
+0

Arbeitete wie ein Charme, danke! Ich wusste nicht einmal über CASE WHEN – truffle

+1

Es ist zu praktisch! Ich würde vorschlagen, ein Tutorial über "CASE WHEN" zu machen. :) – 1000111

+1

Auch Sie können sich die aktualisierte Antwort auf 'SUM' anschauen. @truflel – 1000111

1

Dies sollte funktionieren (COUNT schließt Nullwerte):

SELECT ruleid 
    , COUNT(IF(rating = 'high', 1, NULL)) AS High 
    , COUNT(IF(rating = 'medium', 1, NULL)) AS Medium 
    , COUNT(IF(rating = 'low', 1, NULL)) AS Low 
FROM ratingsPerRuleId 
GROUP BY ruleid 
; 

Auch, wenn Sie bevorzugen Sie COUNT(..., NULL)) mit SUM(..., 0)) ersetzen kann.

Hinweis: 1.000.111 Antwort ist mehr tragbar, da ältere Versionen von MS SQL nicht unterstützen IF(...)

+0

Das hat perfekt funktioniert! Danke! – truffle