Mysql
 sql >> база данни >  >> RDS >> Mysql

mySQL заявка - показва най-популярния елемент

Първоначалното ми предложение беше неправилно :

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;

Това погрешно предполага, че външното агрегиране (по дата) ще избере първия ред от вътрешната извлечена таблица, която е подредена от cnt. Това поведение всъщност е недефинирано и не е гарантирано, че ще бъде последователно.

Ето правилното решение:

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;

Забележка:

Добавих (SELECT COUNT(*)) AS total защото въпросът е зададен за това в една заявка. Това обаче няма да се мащабира, тъй като е свързана подзаявка. Това означава, че за всяка t1.date ще се изпълнява подзаявката SELECT COUNT(*). Моля, направете сравнение и вижте дали работи подходящо за вашите нужди. Ако не, тогава предлагам да получите дневните суми в отделна заявка. Ще обедините тези резултати във вашето приложение.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Показване на 3 елемента на ред - while цикъл - php/mysql

  2. Как да преброя NULL стойности в MySQL?

  3. PlanetScale &Vitess:Референтна цялост с наследени разчленени бази данни

  4. Динамично създаване на условия ИЛИ чрез предаване на масив към заявка в MySQL PHP

  5. Промяна на първичния ключ на MySQL, когато съществуват ограничения на външния ключ