2009-04-26 6 views
2

Ich versuche eine Aufteilung der Forenränge in einem phpBB Forum zu erstellen. Forum-Ränge werden durch deinen Postcount definiert: wenn du zwischen 1-9 Beiträge hast, bist du Level 1; 10-24 und du bist Level 2; und so weiter. (Der maximale Rang ist etwas über 2000 Beiträge.)Wie fragt man count() in einer Reihe von Bereichen gleichzeitig ab?

Gerade jetzt, mein Forum Rangstatistik Seite wird nur ein paar dummen Anfragen tun:

SELECT COUNT(*) from _users WHERE post_count>=1 AND post_count<10; 
SELECT COUNT(*) from _users WHERE post_count>=10 AND post_count<25; 

... Und so weiter.

Die Abfragen laufen in ein paar Sekunden, so bin ich wirklich neugierig (für zukünftige Referenz) ein besserer Weg, um dieses Problem zu lösen - es fühlt sich an als ob es eine Abfrage geben sollte, die Ergebnisse ähnlich zurückgeben wird dazu:

rank_id | count 
1  | 5000 
2  | 2000 
... 

ich einen anderen Tisch haben, die diesen Rang eine Auflistung der Ränge und die Mindestanzahl der Beiträge erforderlich erreichen hat. Nicht sicher, ob das notwendig ist oder ob es eine cleverere Möglichkeit gibt, meine Anfragen zu schreiben.

Ich benutze eine MySQL DB, wenn das hilft, aber ich bin viel mehr interessiert an einer datenbankübergreifenden Antwort.

+0

Ich habe keine Lösung, aber Sie können Ihre Anfragen auf ein wenig, indem Sie SELECT COUNT (user_id) aus _users WHERE POST_COUNT ordentlich ZWISCHEN x UND y; Dies könnte die Dinge wirklich sehr, sehr klein machen. –

Antwort

4

Haften Sie eine UNION zwischen ihnen.

SELECT COUNT(*) from _users WHERE post_count>=1 AND post_count<10; 
UNION 
SELECT COUNT(*) from _users WHERE post_count>=10 AND post_count<25; 

Alternativ können Sie eine CASE verwenden, wann sie zu stapeln und die Ergebnisse zusammenzufassen es auf einer Reihe zu bekommen.

SELECT 
    SUM(CASE WHEN post_count>=1 AND post_count<10 THEN 1 ELSE 0 END) AS Between_1_10 
    SUM(CASE WHEN post_count>=10 AND post_count<25 THEN 1 ELSE 0 END) AS Between_10_25 
    SUM(CASE WHEN post_count>=25 AND post_count<100 THEN 1 ELSE 0 END) AS Between_25_100 
FROM 
    _users 

Oder eine andere Art und Weise, es zu tun ...

SELECT 
    Count(*) 
    , Category 
FROM 
(
    SELECT 
     CASE 
      WHEN post_count>=1 AND post_count<10 THEN '1_To_10' 
      WHEN post_count>=10 AND post_count<25 THEN '10_To_25' 
      WHEN post_count>=25 AND post_count<100 THEN '25_To_100' 
      ELSE 'Over_100' 
     END As Category 
    FROM 
     _users 
) as InnerTable 
GROUP BY 
    Category 
+0

+1 für die zweite. –

+0

Auf der dritten Option (wo Sie die Kategorie in einem Fall WENN und Gruppe ableiten), brauchen Ihre zweite und dritte Fälle die Kriterien> =? Wenn es nicht> = 10 ist, fängt der erste Fall es usw. Entweder +1 für die dritte Option. –

0

Ich glaube, Sie suchen SELECT CASE...WHEN.

Verwandte Themen