开发中遇到这样一种场景,举例说音乐的专辑包含歌曲,假设歌曲放在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 值尚不支持以下比较运算符和函数:BETWEENIN()GREATEST()LEAST()
好吧,不支持的话,你还真没它办法。
总结一下:
1、双select的情况,用IN的时候要看select出来的结果类型是不是json类型,另外,不是简单的数据形式能对上就可以。
2、用Mysql解决此类问题还是加个关联表方便。用mongodb查询就另外设计表结构,毕竟两者是不同的,要用不同的思维来解决问题。