MariaDB/MySQL 选择查询将 ids 的 json 数组替换为连接值

Posted

技术标签:

【中文标题】MariaDB/MySQL 选择查询将 ids 的 json 数组替换为连接值【英文标题】:MariaDB/MySQL select query replace json array of ids into concatenated values 【发布时间】:2019-08-16 04:50:29 【问题描述】:

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

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

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

我的架构如下所示:

帖子

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

标签

id | name

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

【问题讨论】:

您需要为标签使用链接表。这会让事情变得更容易。例如:流派(id,名称)和标签(genre_id,标签) @Alphastrick 好吧,我个人不会设计这样的表格,但是,这是存在的,我必须解决它...... 不确定this 是否对您有帮助 哪个版本的 MariaDB? @Nick 我看到这个:5.5.5-10.3.16-MariaDB-log 作为版本 【参考方案1】:

我不能修改它

理想情况下,您可以考虑对数据进行规范化,这样可以更轻松地处理此问题。话虽如此,在 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;

Demo

【讨论】:

太棒了!这就像完全的魔法。我从来没有想过加入和JSON_SEARCH函数可以这样使用。我学到了很多东西。谢谢 实际上,该表有几个这样的列。我已经对它们进行了测试,但 MaiaDB 拒绝将它们中的多个分组:dbfiddle.uk/… 无论如何要解决这个问题? @Daniel 如果您有后续问题,您应该打开一个新问题。

以上是关于MariaDB/MySQL 选择查询将 ids 的 json 数组替换为连接值的主要内容,如果未能解决你的问题,请参考以下文章

数据库对比:选择MariaDB还是MySQL?

Centos7 之 MariaDB(Mysql) root密码忘记的解决办法

条件更新 MariaDB (MySQL)

mysql查询数据库大小

MariaDB(MySQL)创建删除选择及数据类型使用详解

如果查询中的日期时间有时区,MariaDB MySQL 查询要长得多,但如果没有添加时区,则非常快 - 为啥?