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

Zapytanie mySQL - pokaż najpopularniejszy element

Moja początkowa sugestia była nieprawidłowa :

SELECT
  date, item, SUM(cnt)
FROM (
  SELECT
    date, item, count(item_id) AS cnt
  FROM test_popularity
  GROUP BY date, item_id
  ORDER BY cnt DESC
) t
GROUP BY date;

To błędnie zakłada, że ​​agregacja zewnętrzna (według daty) wybierze pierwszy wiersz wewnętrznej tabeli pochodnej, która została uporządkowana według cnt. To zachowanie jest w rzeczywistości niezdefiniowane i nie ma gwarancji, że będzie spójne.

Oto właściwe rozwiązanie:

SELECT
  t1.date, t1.item, 
  (SELECT COUNT(*) FROM test_popularity WHERE date = t1.date) as total
  # see note!
FROM test_popularity t1
JOIN (
  SELECT date, item, item_id, COUNT(item_id) as count
  FROM test_popularity
  GROUP BY date, item_id
) AS t2
ON t1.date = t2.date AND t1.item_id = t2.item_id
GROUP BY t1.date;

Uwaga:

Dodałem (SELECT COUNT(*)) AS total ponieważ pytanie o to prosiło w jednym zapytaniu. Nie będzie to jednak skalowane, ponieważ jest to skorelowane podzapytanie. Oznacza to, że dla każdej daty t1. zostanie uruchomione podzapytanie SELECT COUNT(*). Proszę porównać i sprawdzić, czy działa odpowiednio do Twoich potrzeb. Jeśli nie, sugeruję uzyskanie dziennych sum w osobnym zapytaniu. Połączysz te wyniki w swojej 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. Synchronizuj dużą lokalną bazę danych z bazą danych serwera (MySQL)

  2. MySQL INSERT ....ON DUPLICATE UPDATE - Dodaje jeden do autoinkrementacji

  3. Uniemożliwianie MySQL wstawiania niejawnych wartości domyślnych do kolumn niepustych

  4. Czy możesz wykonać pętlę For Each Row za pomocą MySQL?

  5. Różnica między where i a klauzulą ​​w zapytaniu join sql