【发布时间】:2019-12-02 16:44:09
【问题描述】:
假设我们有下表
+-----+------------+
| id | categories |
+-----+------------+
| id1 | [20,25] |
| id2 | [25] |
| id3 | [20,25,28] |
| id4 | [28,25] |
| id5 | [20,25] |
+-----+------------+
字段categories 是JSON 类型。它仅包含已知且有限的整数列表 - 例如 20、25、28。
所以,我需要以某种方式计算所有这些值的所有包含项,如下所示:
+-------+--------+
| count | number |
+-------+--------+
| 20 | 3 |
| 25 | 5 |
| 28 | 2 |
+-------+--------+
主要问题是使用单个请求来完成此操作,而无需在服务器代码或过程调用中遍历类别编号
正面决定如下
SELECT
COUNT(id) AS 'count', '20' AS number
FROM
ml_categories
WHERE
JSON_CONTAINS(categories, '20')
UNION SELECT
COUNT(id) AS 'count', '25' AS number
FROM
ml_categories
WHERE
JSON_CONTAINS(categories, '25')
UNION SELECT
COUNT(id) AS 'count', '28' AS number
FROM
ml_categories
WHERE
JSON_CONTAINS(categories, '28')
但是这个解决方案的复杂度为 O(n),而且代码本身还不够好。例如,对于我的硬件上的一个类别,循环约 500K 记录大约需要 1 秒,因此计算 10 个类别大约需要 10 秒。不好。 有没有办法优化这样的查询?
提前致谢,伙计们
【问题讨论】:
-
您的表格不是标准的,如果您可以查看表格,每行输入一个值