当前位置: 首页 > article >正文

Mysql JSON结果不能IN

开发中遇到这样一种场景,举例说音乐的专辑包含歌曲,假设歌曲放在music表,专辑放在album表,而专辑与歌曲的绑定关系,要么就存一个关联表music_ablum,要么就存一个json字段(music_list)在album表。

存一个关联表的做法比较常见,查询某个专辑下所包含的音乐,可以通过以下语句查询

SELECT * from music WHERE music_id IN (SELECT music_id from music_ablum where ma_id=1);

当时想着同理,存一个json字段在album表就省了关联表,谁知,用In查询时,数据不出来

SELECT * from music WHERE music_id IN (SELECT music_list from ablum where a_id=1);

初时以为哪里写错了,检查了一轮也没发现哪里的问题,用CAST(JSON AS CHAR)转换了还是没果,再加狠招,将SUBSTRING将数据截取成标准IN查询的样子。还是不行。

查看Mysql官方文档才发现
在这里插入图片描述
翻译成中文的意思是

JSON 值的比较和排序
可以使用 =、 <、 <=、 >、 >=、 和 运算符比较<>JSON 值 。 !=<=>

JSON 值尚不支持以下比较运算符和函数:

BETWEEN

IN()

GREATEST()

LEAST()

好吧,不支持的话,你还真没它办法。

总结一下:
1、双select的情况,用IN的时候要看select出来的结果类型是不是json类型,另外,不是简单的数据形式能对上就可以。

2、用Mysql解决此类问题还是加个关联表方便。用mongodb查询就另外设计表结构,毕竟两者是不同的,要用不同的思维来解决问题。


http://www.kler.cn/a/303972.html

相关文章:

  • Stable Diffusion:照片转视频插件
  • Java学习--网络编程
  • mysql5.7安装SSL报错解决(2),总结
  • Unity资源打包Addressable资源保存在项目中
  • RAFT: Recurrent All-Pairs Field Transforms for Optical Flow用于光流估计的循环全对场变换
  • 在C++上实现反射用法
  • ES基础知识
  • HarmonyOS学习(十二)——数据管理(一)分布式数据
  • 基于Ubuntu2404搭建mysql8配置远程访问
  • CAT1 DTU软硬件设计开源资料分析(TCP协议+GNSS定位版本 )
  • vue在一个组件引用其他组件
  • Docker Desktop 的安装与汉化指南
  • 【笔记】第二节 熔炼、轧制、热处理和焊接工艺
  • 供应RM500UCNAB-D10-SNADA模块
  • LLM的工作原理详解
  • 替代区块链
  • AI绘画:科技赋能艺术的崭新时代
  • vscode中使用go环境配置细节
  • Leetcode面试经典150题-162.寻找峰值
  • 《Docker:轻量级虚拟化解决方案》
  • Spring MVC 处理请求
  • 低代码-赋能新能源汽车产业加速前行
  • Anolis 8 NVME over TCP 配置使用
  • Qt-常用控件(3)-输入类
  • 【C++】深究C++三大特性之多态
  • 香港电讯SASE解决方案:终端与云端的安全护航