我有以下表格:
过滤器

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/

10-11 03:56
查看更多