Laravel中按Gallery表JSON格式language字段分组查询的实现示例
按JSON数组字段分组查询的可行性及实现示例
可行,只要你的数据库支持JSON类型操作,就能按language字段的JSON数组内容进行分组查询。以下是主流数据库的实现示例:
MySQL 实现
假设Gallery表的language字段存储格式为["zh-CN", "en-US"]这类JSON数组:
按原始JSON数组分组(区分元素顺序)
直接将JSON字段作为分组依据,MySQL会按JSON的语义内容进行比较:
SELECT language, COUNT(*) AS record_count FROM Gallery GROUP BY language;
忽略数组元素顺序分组
如果需要将元素顺序不同但内容相同的数组归为同一组,可先展开数组、排序后重新聚合:
SELECT JSON_ARRAYAGG(DISTINCT lang ORDER BY lang) AS sorted_language, COUNT(*) AS record_count FROM Gallery, JSON_TABLE(language, '$[*]' COLUMNS(lang VARCHAR(50) PATH '$')) AS lang_items GROUP BY sorted_language;
PostgreSQL 实现
推荐将language字段设为jsonb类型(比json性能更优,支持语义化比较):
按原始JSON数组分组(区分元素顺序)
SELECT language, COUNT(*) AS record_count FROM Gallery GROUP BY language;
忽略数组元素顺序分组
通过展开数组、排序后重新聚合为JSON数组,实现无序分组:
SELECT jsonb_agg(DISTINCT lang ORDER BY lang) AS sorted_language, COUNT(*) AS record_count FROM Gallery, jsonb_array_elements(language) AS lang_items(lang) GROUP BY sorted_language;
注意:如果使用
json类型而非jsonb,PostgreSQL会按JSON的字符串字面量进行分组,格式差异(如空格、元素顺序)会导致同一逻辑内容被分为不同组,建议优先使用jsonb。
内容的提问来源于stack exchange,提问作者kralyolda
相关产品推荐
相关产品推荐

