求MySQL一个SQL语句 不包含某个标签的用户列表

  •   
  • 8071
  • MySQL
  • 27
  • super_dodo
  • 2016/11/18

现在的需求和情况是有两张表(用户表和用户标签表),单个用户可以有多个标签,也可以没有任何标签。现在需要查询出不包含某个标签的用户的列表。

用户表 user_list ---ul
user_id		name
1			qq
2			weibo
3			weixin
4			facebook
5			twitter


用户标签标签表 user_tag ---ut
user_id		tag_id
1			100
1			101
1			102
3			101
5			102


求sql语句 查询出不包含标签ID为101的用户列表

说明:一个用户可以没有标签也可以有多个标签

#方法1--子查询
SELECT * FROM user_list as ul 
WHERE NOT EXISTS(SELECT 1 FROM user_tag as ut WHERE ul.user_id=ut.user_id AND ut.tag_id='101');


#方法2--线拼接标签集合--查找字符串
SELECT ul.user_id, ul.name, GROUP_CONCAT(ut.tag_id) FROM user_list as ul
LEFT JOIN user_tag as ut ON ul.user_id = ut.user_id
GROUP BY ul.user_id, ul.name
HAVING instr(GROUP_CONCAT(ut.tag_id), '101') = 0 
OR GROUP_CONCAT(ut.tag_id) IS NULL


//得到的结果为
2
4
5

20161118141258

那么问题来了。要查找包含101,103的标签的语句怎么写呢。可能你会说LEFT JOIN 之后WHERE就可以了,其实不然。且听下回分解。

PHP获得数组交集与差集的方法