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

Режим на изчисление без поле за подзаявка в MySQL?

Опитайте това решение:

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

Обяснение:

Това все още използва форма на подзаявка, но такава, която се изпълнява само веднъж, за разлика от тази, която се изпълнява на база ред по ред, както във вашия оригинален пример.

Работи, като първо изберете product_group id, производителят и броя на появяванията на производителя за всяка отделна група.

FROM sub-select ще изглежда по следния начин след изпълнение (просто съставяне на данни тук):

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

Сега, когато имаме резултата от подизбора, трябва да изберем реда, който има най-много occurences поле за всяка продуктова група.

Във външната заявка ние групираме подизбора още веднъж по product_group поле, но този път само product_group поле. Сега, когато правим нашето GROUP BY тук можем да използваме една наистина завладяваща функция в MySQL, наречена GROUP_CONCAT които можем да използваме, за да свържем производителите заедно и във всеки ред, който пожелаем.

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

Това, което правим тук, е да обединим заедно производителите, които са групирани заедно по product_group id, ORDER BY a.occurrences DESC гарантира, че производителят с най-много изяви се появява първи в свързания списък. Накрая разделяме всеки производител с ::: . Резултатът от това за product_group 1 ще изглежда така:

XYZ:::Test:::Singleton

XYZ се появява първо, тъй като има най-високата стойност в occurance поле. Само ние искате да изберете XYZ , така че обграждаме конкатенацията в SUBSTRING_INDEX , което ще ни позволи да изберем само първия елемент от списъка въз основа на ::: разделител.

Крайният резултат ще бъде:

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. Защо PDO_MySQL не върне цяло число?

  2. възникна фатална грешка по време на изпълнение... по време на актуализация

  3. Кой е най-сигурният начин за съхраняване на потребителски пароли в база данни с помощта на PHP?

  4. 1292 Неправилна стойност за дата и час за колона 'updated_at'

  5. Как да разпределя IP адрес във VPC към RDS инстанция?