Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Chế độ tính toán không có trường truy vấn con trong MySQL?

Hãy thử giải pháp này:

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

Giải thích:

Điều này vẫn sử dụng một dạng truy vấn con, nhưng một truy vấn chỉ thực thi một lần thay vì một truy vấn thực thi trên cơ sở từng hàng, chẳng hạn như trong ví dụ ban đầu của bạn.

Nó hoạt động bằng cách chọn product_group trước tiên id, nhà sản xuất và số lần nhà sản xuất xuất hiện cho mỗi nhóm cụ thể.

FROM sub-select sẽ trông giống như thế này sau khi thực thi (chỉ tạo dữ liệu ở đây):

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

Bây giờ chúng ta có kết quả chọn phụ, chúng ta cần chọn hàng có giá trị tối đa trong occurences cho từng nhóm sản phẩm.

Trong truy vấn bên ngoài, chúng tôi nhóm lựa chọn con lại một lần nữa theo product_group nhưng lần này, chỉ product_group đồng ruộng. Bây giờ khi chúng tôi thực hiện GROUP BY ở đây, chúng ta có thể sử dụng một hàm thực sự hấp dẫn trong MySQL có tên là GROUP_CONCAT mà chúng tôi có thể sử dụng để kết hợp các nhà sản xuất với nhau và theo bất kỳ thứ tự nào chúng tôi muốn.

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

Những gì chúng tôi đang làm ở đây là nối các nhà sản xuất với nhau được nhóm lại với nhau theo product_group id, ORDER BY a.occurrences DESC đảm bảo rằng nhà sản xuất có nhiều lần xuất hiện nhất sẽ xuất hiện đầu tiên trong danh sách nối. Cuối cùng, chúng tôi phân tách từng nhà sản xuất bằng ::: . Kết quả của việc này cho product_group 1 sẽ giống như sau:

XYZ:::Test:::Singleton

XYZ xuất hiện đầu tiên vì nó có giá trị cao nhất trong occurance đồng ruộng. Chúng tôi chỉ muốn chọn XYZ , vì vậy chúng tôi mã hóa phần nối trong SUBSTRING_INDEX , điều này sẽ cho phép chúng tôi chỉ chọn phần tử đầu tiên của danh sách dựa trên ::: dấu phân cách.

Kết quả cuối cùng sẽ là:

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. Lưu trữ và truy xuất đường dẫn hình ảnh trong cơ sở dữ liệu mysql php

  2. gem cài đặt mysql thất bại

  3. Ứng dụng của tôi có thể được hưởng lợi như thế nào từ các bảng tạm thời?

  4. Cách tạo tập lệnh từ sơ đồ trong MySQL Workbench

  5. Điều gì sẽ xảy ra nếu tôi giết một truy vấn MySQL InnoDb DELETE rất lớn?