mysql模糊查询的一个问题
昨儿前同事抛出来一个问题
表1:user_tag
| id | tag_name |
| 1 | VIP |
| 2 | VVIP,LEV1 |
| 3 | SSVIP,LEV2 |
| 4 | LEV3 |
表2:tag_label
| id | tag |
| 1 | VIP |
| 2 | VVIP |
| 3 | SSVIP |
需求是这样的,查询user_tag表中的tag_name中含有tag_label表中tag的行
按照图中数据就是查询出user_tag中id为1,2,3的数据来
解题思路:
1.如果tag_name只有一个tag的话可以使用函数FIND_IN_SET(str,strlist)
先查出 strlist : SELECT GROUP_CONCAT(user_tag.tag_name) FROM user_tag
然后 SELECT * FROM user_tag WHERE FIND_IN_SET(user_tag.tag_name,'VVIP,VIP,SSVIP')
这样的查询只能是查询单个tag,如果打乱顺序或者tag_name中有不存在的tag就不可以了
2.此路不通之后,就想着结合内存来做:
SELECT user_tag.*,GROUP_CONCAT(tag_label.tag) FROM user_tag,tag_label GROUP BY user_tag.tag_name;
这样查出来的结果就是

这样就可以去内存做for循环删除过滤了
3.今天晚上某位大佬想到了个方法,利用模糊查询来做,其实我当时想到了使用模糊查询,但是突然对模糊查询的概念理解模糊,就忽略过去了,具体sql就是
SELECT * FROM user_tag WHERE EXISTS (
SELECT 1 FROM tag_label WHERE CONCAT(",",user_tag.tag_name,",") LIKE CONCAT("%,",tag_label.tag,",%")
);
这样利用模糊查询 举个例子就是存在 ",SSVIP,LEV2," like "%,SSVIP,%" 这种结果

浙公网安备 33010602011771号