mysql - MySQL 8 - JSON_ARRAYAGG 中的排序和过滤
问题描述
最近我安装了 MySQL 8.0.11 GA 并且想优化一些视图,功能,......通常我有这样的东西:
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 中实现这一点,以便能够在过程、函数、事件、触发器、视图……中使用它。
解决方案
从 MySQL 8.0.14 开始,JSON_ARRAYAGG() 和其他 JSON 函数可用于窗口函数,其中可以指定顺序。
推荐阅读
- r - 扩展函数在两列之一中返回所有“NA”
- random - AMD FX 8350 上是否有 rdrand 指令?
- json - 使用 json 文件中的 lambda 函数过滤数据以存储在表 JavaFX 中
- c# - 如何在父控件中捕获子控件生成的事件?
- postgresql - 此查询如何填充数据?
- javascript - Javascript 使用大写和小写字母生成 AES
- bash - 在bash中结合Grep和Paste命令
- kotlin - 如何使用 Kotlin 从 imageView 获取像素颜色?
- java - 如何通过单击JSP中的按钮调用java方法并传递参数?
- reactjs - 错误 _this.props.childcall 不是函数。(在 '_this2.props.childcall()' 中未定义)