Недавно я установил 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 () вместо всего приведения + concat + group_concat, но я не могу понять, как установить порядок или как его игнорировать дубликаты Кто-нибудь знает, есть ли способ выполнить какую-либо сортировку или фильтрацию в JSON_ARRAYAGG ()?
Кстати: я знаю, что можно достичь этого в rust, php, ... но я хочу добиться этого в SQL, чтобы иметь возможность использовать это в процедурах, функциях, событиях, триггерах, представлениях, ...