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,%" 这种结果

posted @ 2020-09-15 22:43  大头Tou  阅读(248)  评论(0)    收藏  举报