首页 > 解决方案 > MariaDB/MySQL 选择查询将 ids 的 json 数组替换为连接值

问题描述

我对数据库查询不太熟悉,但我想做以下事情:在表中,我存储了一列标签 ID,例如:[1,6,8]并且我希望"Music, Dance, Pop"在我的选择查询中返回。

我没有设计数据库架构,也不允许修改它。

我想这样做的原因是这个查询的响应将直接发送到客户端进行表渲染,并且使用当前的 ORM 检索(PHP Laravel),这需要很长时间才能为每一行检索相同的相关模型。所以我想知道这样的查询是否可行。

我的架构看起来像这样:

帖子

id | name | ... | tag_ids (JSON array) | ...

标签

id | name

我曾想过使用JSON_REPLACE,但根本不知道如何解决这个问题。在没有代码来发布处理结果的普通 SQL 中,这甚至可能吗?

标签: mysqlsqlmariadb

解决方案


我不允许修改它

理想情况下,您可能会考虑对数据进行规范化,这样可以更轻松地处理此问题。话虽如此,在 JSON 函数的帮助下,我们可以尝试将连接与聚合相结合:

SELECT
    p.id,
    p.name,
    GROUP_CONCAT(t.name) AS tag_names
FROM posts p
LEFT JOIN tags t
    ON JSON_SEARCH(p.tag_ids, 'one', t.id) IS NOT NULL
GROUP BY
    p.id,
    p.name;

演示


推荐阅读