Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL SELECT najczęściej według grupy

SELECT t1.*
FROM (SELECT tag, category, COUNT(*) AS count
      FROM tags INNER JOIN stuff USING (id)
      GROUP BY tag, category) t1
LEFT OUTER JOIN 
     (SELECT tag, category, COUNT(*) AS count
      FROM tags INNER JOIN stuff USING (id)
      GROUP BY tag, category) t2
  ON (t1.tag = t2.tag AND (t1.count < t2.count 
      OR t1.count = t2.count AND t1.category < t2.category))
WHERE t2.tag IS NULL
ORDER BY t1.count DESC;

Zgadzam się, że to trochę za dużo dla pojedynczego zapytania SQL. Jakiekolwiek użycie GROUP BY wewnątrz podzapytania sprawia, że ​​się krzywię. Możesz sprawić, by wyglądało prostsze dzięki widokom:

CREATE VIEW count_per_category AS
    SELECT tag, category, COUNT(*) AS count
    FROM tags INNER JOIN stuff USING (id)
    GROUP BY tag, category;

SELECT t1.*
FROM count_per_category t1
LEFT OUTER JOIN count_per_category t2
  ON (t1.tag = t2.tag AND (t1.count < t2.count 
      OR t1.count = t2.count AND t1.category < t2.category))
WHERE t2.tag IS NULL
ORDER BY t1.count DESC;

Ale w zasadzie wykonuje tę samą pracę za kulisami.

Komentujesz, że możesz łatwo wykonać podobną operację w kodzie aplikacji. Więc dlaczego tego nie zrobisz? Wykonaj prostsze zapytanie, aby uzyskać liczby według kategorii:

SELECT tag, category, COUNT(*) AS count
FROM tags INNER JOIN stuff USING (id)
GROUP BY tag, category;

I posortuj wynik w kodzie aplikacji.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP i MySQL porównaj hasło

  2. Przesuwaj MySQL bez ograniczeń

  3. MYSQL UPDATE SET w tej samej kolumnie, ale z wieloma klauzulami WHERE

  4. Napraw „ERROR 3942 (HY000):Każdy wiersz klauzuli VALUES musi mieć co najmniej jedną kolumnę” podczas korzystania z instrukcji VALUES w MySQL

  5. Utwórz bazę danych w Shell Script - przekonwertuj z PHP