【问题标题】:Can I get unique/distinct values of json column in MySQL?我可以在 MySQL 中获取 json 列的唯一/不同值吗?
【发布时间】:2020-03-06 08:47:17
【问题描述】:

解释起来有点难,我就举例说明,

假设我有这样的表(标签是 json 列)

+----+-------------------+--------------------+
| id |    occupation     |        tags        |
+----+-------------------+--------------------+
|  1 | Mold Maker        | [Men, Shop, Shoes] |
|  2 | Software Engineer | [Men, Lifestyle]   |
|  3 | Electrician       | [Shop, Lifestyle]  |
|  4 | Software Engineer | [Men, Lifestyle]   |
|  5 | Software Engineer | [Shoes]            |
+----+-------------------+--------------------+

当我想获得独特的职业价值时,我只需像这样查询。

SELECT DISTINCT occupation FROM customers;

SELECT occupation FROM customers GROUP BY occupation;

result
+-------------------+
|    occupation     |
+-------------------+
| Mold Maker        |
| Software Engineer |
| Electrician       |
+-------------------+

我想要标签的唯一值,如下所示

+-----------+
|   tags    |
+-----------+
| Men       |
| Shop      |
| Shoes     |
| Lifestyle |
+-----------+

到目前为止,我尝试阅读 MySQL 手册和谷歌中的所有 JSON_* 函数和 JSON_TABLE,但找不到这样做的方法,是否有办法获得我想要的结果。

【问题讨论】:

  • 如果你想在标签列中操作数据,那么你不应该将它存储为json,而是以规范化的形式。
  • 您使用的是哪个版本的 MySQL?
  • @Shadow 你的意思是在单独的表格中存储标签?
  • @GMB mysql:5.7.
  • "到目前为止,我尝试阅读 MySQL 手册和谷歌中的所有 JSON_ 函数和 JSON_TABLE,但找不到这样做的方法,有没有办法得到我想要的结果。”* “非常感谢它在 MySQL 8 中工作,但在 5.6 中不能工作,你能帮忙吗?” this 是我如何调整或者我应该说 过去在 MySQL 8 下的 MySQL 版本中的 JSON_TABLE() 支持中的“hacked” ...

标签: mysql sql arrays json unnest


【解决方案1】:

在 MySQL 8.0 中,json 函数 json_table() 可以轻松完成此任务:

select distinct tag
from 
    mytable,
    json_table(
        tags,
        "$[*]"
        columns (tag varchar(50) PATH "$")
    ) t
order by tag

在早期版本中,解决方案是使用数字表。这假设您事先知道 json 数组中的最大元素数:

select distinct replace(
    json_extract(tags, concat('$[', nums.n, ']')),
    '"',
    ''
) tag
from 
    (
        select 0 n 
        union all select 1 
        union all select 2 
        union all select 3 
        union all select 4
    ) nums
    inner join mytable t
        on json_extract(t.tags, concat('$[', nums.n, ']')) is not null 
    order by tag

Demo on DB Fiddle

|标签 | | :-------- | |生活方式 | |男装 | |鞋 | |店铺 |

【讨论】:

  • 谢谢,我不完全理解,但它有效,我稍后会找时间做研究。
  • MYSQL 10.5 语法错误:dbfiddle 。有趣的是,早期版本是正确的......
  • @Brownrice:那是 MariaDB 10.5,而不是 MySQL。截至目前,json_table() 还没有在 MariaDB 中实现,即使在最新版本中也是如此。
【解决方案2】:

你可以在 MySQL 8+ 中使用JSON_TABLE()

select DISTINCT tag.tag
from t cross join
     json_table(t.tags, '$[*]' COLUMNS (tag varchar(255) path '$')) tag

Here 是一个 dbfiddle。

【讨论】:

  • 非常感谢它在 MySQL 8 中工作,但在 5.6 中不能工作,你能帮忙吗?
  • @KyawKyawSoe 。 . .唉,这个功能在 8 之前不可用。我可能会建议你升级;在较新的版本中,JSON 支持要好得多。
猜你喜欢
  • 1970-01-01
  • 2022-01-18
  • 2023-01-24
  • 2022-12-20
  • 1970-01-01
  • 2020-01-22
  • 2012-05-06
  • 2019-05-31
  • 1970-01-01
相关资源
最近更新 更多