我有以下表格:
过滤器
id | u_ids
1 | 1, 2, 3
2 | 5, 6
用户
id | name
1 | Tom
2 | Tim
3 | Sue
4 | Bruce
5 | Ann
6 | George
我想运行以下选择
select * from users where id in (select u_ids from filters where id =1);
我想收到
id | name
1 | Tom
2 | Tim
3 | Sue
但我什么也得不到。
问题是字段
u_ids
是文本,因此“in select”返回类似于“1、2、3”(带分号)的内容,因此in找不到任何值。是否有任何选项可以进行转换或将字符串更改为数组?
最佳答案
最好规范化您的模式,不要以逗号分隔列表的形式存储关系,而是为此创建一个连接表,例如维护用户和筛选器之间的m:m多对多关系,使用列filter id和用户id创建一个新表,并且在每行中为每个用户保存一个关联,并像在当前模式中那样进行筛选过滤器1与许多用户的关系
filter id user id
(1, '1'),
(1, '2'),
(1, '3'),
示例架构将如下所示
CREATE TABLE user_filters
(`fid` int, `u_id` varchar(50))
;
INSERT INTO user_filters
(`fid`, `u_id`)
VALUES
(1, '1'),
(1, '2'),
(1, '3'),
(2, '5'),
(2, '5')
;
CREATE TABLE filters
(`id` int, `title` varchar(50))
;
INSERT INTO filters
(`id`, `title`)
VALUES
(1, 'test'),
(2, 'test 1')
;
CREATE TABLE users
(`id` int, `name` varchar(6))
;
INSERT INTO users
(`id`, `name`)
VALUES
(1, 'Tom'),
(2, 'Tim'),
(3, 'Sue'),
(4, 'Bruce'),
(5, 'Ann'),
(6, 'George')
;
对于上面的模式,可以使用join as轻松查询,下面的查询可以使用索引进行优化
select u.*
from users u
join user_filters uf on(uf.u_id = u.id)
where uf.fid =1
Sample Demo
如果您不能改变您的模式,并且想坚持使用当前的模式,您可以按如下所示进行查询,但是与上面的查询相比,这个模式的优化程度不够
select u.*
from users u
join filters f on(find_in_set(u.id,replace(`u_ids`,' ','')) > 0)
where f.id =1
Sample Demo
Database Normalization
关于mysql - MySQL::从逗号分隔的字符串中选择,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25644986/