2013-01-10 11 views
7

Mam tabeli o nazwie foo z tych pól:Jak zwracać wiersze wymienione w porządku malejącym według COUNT (*)?

- id 

- type 

- parentId 

Chcę wybrać listę IDS macierzystych, w kolejności malejącej swoich COUNT(*) ile razy pojawiają się one w tabeli. Coś takiego:

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

Jak to zrobić w najbardziej efektywny sposób i najmniej obciążając serwer?

Nie może być tysiące-setki tysięcy rekordów w tabeli, więc ręcznie przechodzi każdego rekordu nie jest do przyjęcia ..

Odpowiedz

13

prostu przez przyłożenie GROUP BY klauzuli, a zakładając, że masz indeksu, FOREIGN KEY lub PRIMARY KEY na parentId, wydajność powinna być całkiem dobra. (parentId wygląda na to, że prawdopodobnie jest to FORIEGN KEY, więc pamiętaj, aby zdefiniować ograniczenie wymuszające indeksowanie).

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

Jak można to zrobić w sposób jak najbardziej efektywny i oddanie najmniejsze obciążenie serwera?

Kluczem jest najbardziej efektywny sposób.

Not a Count() na pewno, ale najskuteczniejsza jest ... odczytanie pola, w którym przechowuje się wynik Count. Możesz go zaktualizować za pomocą wyzwalacza lub po wstawieniu.

Zwłaszcza gdy

Nie może być tysiące-setki tysięcy rekordów w tabeli

Powiązane problemy