2013-01-10 9 views
7

Ich habe eine Tabelle foo mit diesen Feldern genannt:Wie werden Zeilen in absteigender Reihenfolge von COUNT (*) zurückgegeben?

- id 

- type 

- parentId 

Ich mag eine Liste von Eltern IDS wählen, in der absteigenden Reihenfolge ihrer COUNT(*), wie oft sie in der Tabelle erscheinen. Etwas wie folgt aus:

SELECT DISTINCT parentId FROM `foo` 
ORDER BY (COUNT(parentId) DESC where parentId = parentId) 

Wie dies auf die effizienteste Art und Weise durchgeführt werden und die geringste Last auf dem Server setzen?

Es kann sein, Tausende-Hunderttausende von Datensätzen in der Tabelle, so manuell durch jeden Datensatz gehen nicht akzeptabel ist ..

Antwort

13

einfach durch eine GROUP BY Klausel anwenden, und vorausgesetzt, Sie einen Index haben, FOREIGN KEY oder PRIMARY KEY auf parentId, sollte die Leistung ziemlich gut sein. (parentId sieht so aus, als wäre es wahrscheinlich ein FORIEGN KEY, also stellen Sie sicher, dass Sie die Einschränkung definieren, um die Indizierung zu erzwingen).

SELECT `parentId` 
FROM `foo` 
GROUP BY `parentId` 
ORDER BY COUNT(*) DESC 
1

Wie kann dies auf die effizienteste Art und Weise durchgeführt werden und auf dem Server mit der geringsten Last setzen?

Der Schlüssel ist der effizienteste Weg.

Kein Count() sicher, aber am effizientesten ist ... ein Feld zu lesen, in dem Sie das Count-Ergebnis speichern. Sie können es mit einem Trigger oder nach dem Einfügen aktualisieren.

Vor allem, wenn

Es kann

in der Tabelle Tausende-Hunderttausende von Datensätzen sein
Verwandte Themen