FIND_IN_SET:类似于like,但是更加的严谨.
有一个任务表task
CREATE TABLE `task` (
`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '任务id',
`name` varchar(30) NOT NULL COMMENT '任务名称',
`hot_uid_list` varchar(512) DEFAULT NULL COMMENT '热门账号表',
`task_uid` bigint(11) NOT NULL COMMENT '任务发起人',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
)
一个用户表
CREATE TABLE `user` (
`id` bigint(11) NOT NULL COMMENT '用户id',
`nickname` varchar(50) NOT NULL COMMENT '用户昵称',
`gender` int(1) NOT NULL DEFAULT '0' COMMENT '用户性别:0未知,1男2女',
PRIMARY KEY (`id`),
)
一个热门用户表
CREATE TABLE `hot_user` (
`id` bigint(11) NOT NULL COMMENT '其实就是用户表的id',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
)
其中任务表中的hot_uid_list字段存着hot_user的id,存储形式是这样的 101,102,103
这时我们的需求是这样的,
查出某个任务发起人的任务包含的热门用户的昵称,以及对应的任务名称
这时就要用到FIND_IN_SET与GROUP_CONCAT
语句如下:
select b.nickname,(select GROUP_CONCAT(name SEPARATOR ',') from task where FIND_IN_SET(b.id,hot_uid_list)) as taskName from task a,user,b,hot_user c
where b.id = c.id and a.task_uid = 1 and FIND_IN_SET(a.id,hot_uid_list) AND FIND_IN_SET(b.id,hot_uid_list) GROUP BY b.id