MySQL 8 - 在 JSON_ARRAYAGG 中排序和过滤

标签 mysql json sql-order-by distinct

最近安装了MySQL 8.0.11 GA,想优化一些 View ,函数,... 通常我有这样的东西:

CREATE TABLE `PublicHoliday` (
  `PublicHoliday_ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `PublicHoliday_Name` varchar(45) NOT NULL,
  `CompanyGroup_ID` int(2) unsigned NOT NULL,
  `Holiday` date NOT NULL,
  `State_ID` int(2) unsigned NOT NULL,
  PRIMARY KEY (`PublicHoliday_ID`),
  UNIQUE KEY `PublicHoliday_Comb` (`CompanyGroup_ID`,`Holiday`,`PublicHoliday_Name`,`State_ID`),
  CONSTRAINT `CompanyGroup_PublicHoliday` FOREIGN KEY (`CompanyGroup_ID`) REFERENCES `CompanyGroup` (`CompanyGroup_ID`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

对于 MySQL 5.7,我必须做类似的事情

SELECT      CompanyGroup_ID,
            CAST(CONCAT('[',(
                GROUP_CONCAT(
                    DISTINCT JSON_OBJECT(
                        'Holiday', Holiday,
                        'PublicHoliday_Name', PublicHoliday_Name,
                        'PublicHoliday_ID', PublicHoliday_ID
                    )
                    ORDER BY Holiday ASC
                )
            ),']') AS JSON) AS HolidayArr
FROM        CompanyGroup
LEFT JOIN   Holiday
    USING(CompanyGroup_ID)
GROUP BY    CompanyGroup_ID

现在随着 MySQL 8.0.11 GA 的发布,我考虑使用 JSON_ARRAYAGG()而不是整个 cast + concat + group_concat 但我不知道如何设置顺序或如何忽略重复项。有谁知道是否有办法在 JSON_ARRAYAGG() 中实现任何排序或过滤?

顺便说一句:我知道可以在 rust、php 中实现这一点,...但我想在 SQL 中实现这一点,以便能够在过程、函数、事件、触发器、 View 中使用它...

最佳答案

自 MySQL 8.0.14 起,JSON_ARRAYAGG() 和其他 JSON 函数可用于窗口函数,其中可以指定顺序。

关于MySQL 8 - 在 JSON_ARRAYAGG 中排序和过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50151832/

相关文章:

MySQL 按第一周值分组,同时包括第二周值

c# - 如何解析json值长字符

php - 为什么我将 json 的显示加倍

Angularjs orderBy : how to call default comparator from custom sort function

php - MYSQL 选择最后 3 行,按 ASC 排序

mysql - 将 mysql 查询拆分为两个以避免 join -> sum ids 并使用 where in

php - 我正在尝试使用 php 和 jquery.php 变量更改 div 的背景图像,但未获取值

php - php中的require_once没有这样的文件或目录错误

ruby - 使用 Ruby 取消转义字符串中的字符

mysql - 在指定了 ORDER BY 和 LIMIT 并且实际上只需要连接少量行的 JOIN 情况下,MySQL 的行为如何?