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

Perhitungan mode tanpa bidang subquery di MySQL?

Coba solusi ini:

SELECT
    a.product_group,
    SUBSTRING_INDEX(GROUP_CONCAT(a.manufacturer ORDER BY a.occurrences DESC SEPARATOR ':::'), ':::', 1) AS manufacturer_mode
FROM
    (
        SELECT
            aa.product_group,
            aa.manufacturer,
            COUNT(*) AS occurrences
        FROM
            products aa
        GROUP BY
            aa.product_group,
            aa.manufacturer
    ) a
GROUP BY
    a.product_group

Penjelasan:

Ini masih menggunakan bentuk subquery, tetapi yang dijalankan hanya sekali, berbeda dengan yang dijalankan berdasarkan baris demi baris seperti dalam contoh asli Anda.

Ia bekerja dengan terlebih dahulu memilih product_group id, pabrikan, dan hitungan berapa kali pabrikan muncul untuk setiap grup tertentu.

FROM sub-pilih akan terlihat seperti ini setelah eksekusi (hanya membuat data di sini):

product_group   |   manufacturer   |    occurrences
---------------------------------------------------
1               |   XYZ            |    4
1               |   Test           |    2
1               |   Singleton      |    1
2               |   Eloran         |    2
2               |   XYZ            |    1

Sekarang kita memiliki hasil sub-pilih, kita perlu memilih baris yang memiliki maksimum occurences untuk setiap grup produk.

Di kueri luar, kami mengelompokkan subpilihan sekali lagi dengan product_group lapangan, tapi kali ini, hanya product_group bidang. Sekarang ketika kita melakukan GROUP BY di sini, kita dapat menggunakan fungsi yang sangat menarik di MySQL yang disebut GROUP_CONCAT yang dapat kita gunakan untuk menggabungkan produsen bersama-sama dan dalam urutan apa pun yang kita inginkan.

...GROUP_CONCAT(a.manufacturer ORDER BY a.occurrences DESC SEPARATOR ':::'...

Apa yang kami lakukan di sini adalah menggabungkan produsen yang dikelompokkan bersama per product_group id, ORDER BY a.occurrences DESC memastikan bahwa pabrikan dengan penampilan paling banyak muncul pertama dalam daftar gabungan. Akhirnya kami memisahkan setiap produsen dengan ::: . Hasil dari ini untuk product_group 1 akan terlihat seperti:

XYZ:::Test:::Singleton

XYZ muncul pertama kali karena memiliki nilai tertinggi di occurance bidang. Kami hanya ingin memilih XYZ , jadi kami membungkus rangkaian dalam SUBSTRING_INDEX , yang akan memungkinkan kita untuk hanya memilih elemen pertama dari daftar berdasarkan ::: pembatas.

Hasil akhirnya adalah:

product_group    |    manufacturer_mode
---------------------------------------
1                |    XYZ
2                |    Eloran



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Conditional ON DUPLICATE KEY UPDATE (Update hanya jika kondisi tertentu benar)

  2. Tampilkan catatan yang menghitung data kolom tertentu dan menjumlahkan jumlah total

  3. Tiga kueri tabel yang digabungkan dengan hubungan banyak ke banyak di JPA

  4. Nilai bidang yang dihitung berdasarkan kolom lain saat penyisipan

  5. MySQL:subquery ATAU serikat pekerja?