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`
JSON 中的值是字符串类型,而在产品 table 中它们是数字。 MySQL 不会隐式转换 JSON 的数据类型而不是其他数据类型,因为 JSON 中的 "
字符不仅是数据类型标记,而且从 MySQL 的角度来看,它们是价值的一部分。因此,将 dquote 字符添加到要搜索的值中。
我目前正在使用 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`
JSON 中的值是字符串类型,而在产品 table 中它们是数字。 MySQL 不会隐式转换 JSON 的数据类型而不是其他数据类型,因为 JSON 中的 "
字符不仅是数据类型标记,而且从 MySQL 的角度来看,它们是价值的一部分。因此,将 dquote 字符添加到要搜索的值中。