Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

kueri mySQL - tampilkan item paling populer

Saran awal saya adalah salah :

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;

Ini secara keliru mengasumsikan bahwa agregasi luar (berdasarkan tanggal) akan memilih baris pertama dari tabel turunan dalam yang dipesan oleh cnt. Perilaku ini, pada kenyataannya, tidak terdefinisi dan tidak dijamin konsisten.

Inilah solusi yang tepat:

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;

Catatan:

Saya menambahkan (SELECT COUNT(*)) AS total karena pertanyaannya menanyakan ini dalam satu kueri. Namun, ini tidak akan diskalakan karena merupakan subquery yang berkorelasi. Ini berarti bahwa untuk setiap t1.date subquery SELECT COUNT(*) akan dijalankan. Silakan lakukan benchmark dan lihat apakah kinerjanya sesuai dengan kebutuhan Anda. Jika tidak, maka saya sarankan untuk mendapatkan total harian dalam kueri terpisah. Anda akan menggabungkan hasil ini dalam aplikasi Anda.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara MENGOPTIMALKAN tabel 9GB jika disk memiliki ruang kosong yang sangat sedikit?

  2. Bagaimana saya bisa membuat tabel di MySQL yang disebut pesanan?

  3. Memisahkan Hasil Query PHP menjadi Kolom

  4. cara menyimpan bahasa India seperti Telugu, Hindi di database mysql

  5. Panggil ke fungsi yang tidak ditentukan session_register()