MySQL 如何在带有列名的 where 语句中搜索 JSON 数组或 JSON_CONTAINS

MySQL how to search JSON Array or JSON_CONTAINS in where statement with column name

我目前正在使用 MySQL 5.7。 Products table 包含一个用于存储类别 ID 的列。这些 ID 存储在 JSON 字符串中。我正在寻找最有效的方法来计算每个类别中的产品数量。

我有以下分类和产品tables

类别:

id name
1 clothes
2 Electronics

产品:

id name category_id
1 test 01 ["1"]
2 test 02 ["1","2"]
3 test 03 ["2"]
4 test 04 NULL

我的查询:

SELECT
    `categories`.`id`,
    `categories`.`name`
    (
    SELECT
        COUNT(`id`)
    FROM
        `products`
    WHERE
        JSON_CONTAINS(
            `products`.`category_id`,
            '\"`categories`.`id`\"'
        )
) AS `products_count`
FROM
    `categories`
ORDER BY `products_count`

但我得到 products_count 作为 0。但是如果我在列名上使用值而不是

JSON_CONTAINS( `products`.`category_id`, '"2"') 

我得到正确的 products_count。以及使用值时的其他测试查询。

我尝试了很多答案,但 none 产生了预期的结果。大部分都是基于数值或者内在json key/values only.

我测试了很多查询,但其中 none 是实际结果。其中一些出现 json 参数或类似错误。一些经过测试的查询是

JSON_SEARCH(`courses`.`category_id`, 'all', `categories`.`id`) 
JSON_CONTAINS( `courses`.`category_id`, `categories`.`id`, '$')
JSON_CONTAINS(`courses`.`sub_category_id`, JSON_QUOTE(`categories`.`id`), '$')

我正在使用 MySQL 5.7,PHP 7.4

提前致谢...

SELECT
    `Categories`.`id`,
    `Categories`.`name`,
    (
    SELECT
        COUNT(`id`)
    FROM
        `Products`
    WHERE
        JSON_CONTAINS(
            `Products`.`category_id`,
            CONCAT('"',`Categories`.`id`,'"')
        )
) AS `products_count`
FROM
    `Categories`
ORDER BY `products_count`

fiddle

JSON 中的值是字符串类型,而在产品 table 中它们是数字。 MySQL 不会隐式转换 JSON 的数据类型而不是其他数据类型,因为 JSON 中的 " 字符不仅是数据类型标记,而且从 MySQL 的角度来看,它们是价值的一部分。因此,将 dquote 字符添加到要搜索的值中。