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

Permintaan:hitung beberapa agregat per item

Berikut triknya:menghitung SUM() nilai yang diketahui 1 atau 0 setara dengan COUNT() dari baris dengan nilai 1. Dan Anda tahu bahwa perbandingan boolean menghasilkan 1 atau 0 (atau NULL).

SELECT c.catname, COUNT(m.catid) AS item_count,
  SUM(i.ownerid = @ownerid) AS owner_item_count
FROM categories c
  LEFT JOIN map m USING (catid)
  LEFT JOIN items i USING (itemid)
GROUP BY c.catid;

Adapun pertanyaan bonus, Anda cukup melakukan gabungan dalam alih-alih gabungan luar, yang berarti hanya kategori dengan setidaknya satu baris di map akan dikembalikan.

SELECT c.catname, COUNT(m.catid) AS item_count,
  SUM(i.ownerid = @ownerid) AS owner_item_count
FROM categories c
  INNER JOIN map m USING (catid)
  INNER JOIN items i USING (itemid)
GROUP BY c.catid;

Inilah solusi lain, yang tidak seefisien tetapi saya akan menunjukkannya untuk menjelaskan mengapa Anda mendapatkan kesalahan:

SELECT c.catname, COUNT(m.catid) AS item_count,
  SUM(i.ownerid = @ownerid) AS owner_item_count
FROM categories c
  LEFT JOIN map m USING (catid)
  LEFT JOIN items i USING (itemid)
GROUP BY c.catid
HAVING item_count > 0;

Anda tidak dapat menggunakan alias kolom di WHERE klausa, karena ekspresi dalam WHERE klausa dievaluasi sebelum ekspresi dalam daftar pilih. Dengan kata lain, nilai yang terkait dengan ekspresi daftar pilihan belum tersedia.

Anda dapat menggunakan alias kolom di GROUP BY , HAVING , dan ORDER BY klausa. Klausa ini dijalankan setelah semua ekspresi dalam daftar pilihan telah dievaluasi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mengapa kueri ini mengembalikan baris dengan nol

  2. pernyataan yang disiapkan di mana nilai ada dalam array

  3. Cegah kenaikan otomatis InnoDB PADA KUNCI DUPLICATE

  4. ubah stempel waktu mysql menjadi tanggal dan waktu aktual?

  5. Kinerja operator MySQL IN pada jumlah nilai (besar?)