当前位置: 首页 > 面试题库 >

MySQL ::从逗号分隔的字符串中选择

彭允晨
2023-03-14
问题内容

我有以下表格:

过滤器

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
多对多关系,并创建一个新表,user_filters其中包括过滤器ID和用户列id并在每行中为每个用户保存一个关联,并且过滤器就像您当前架构关系中的过滤器1中有很多用户的(1,'1, 2, 3') 情况一样

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轻松查询,下面的查询可以使用索引进行优化

select u.* 
from users u
join user_filters uf on(uf.u_id = u.id)
 where uf.fid =1

样本演示

如果您无法更改自己的架构并希望坚持使用当前架构,则可以按以下方式查询,但与上述查询相比,该架构无法充分优化

select u.* 
from users u
join filters f on(find_in_set(u.id,replace(`u_ids`,' ','')) > 0)
 where f.id =1

样本演示

数据库规范化



 类似资料:
  • 问题内容: 我需要以以下方式执行选择查询: 实现该目标的正确方法是什么? 考虑到我可以控制发送字符串的客户端代码,有没有更好的方法?(该字符串将包含大约30个id,因此我试图避免发送30个参数,每个id一个)。 谢谢你们 问题答案: 您可以使用MySQL 函数: 附录 :请注意,上面的查询 无法 优化,因此,如果您在MySQL 上有索引,则不会使用它。您必须决定使用相对简单是否值得潜在的性能损失(

  • 问题内容: 我想在MySQL中将选定的值转换为逗号分隔的字符串。我的初始代码如下: 哪个产生了: 我想要的输出看起来像这样: 问题答案: 检查一下

  • 问题内容: 我从数据库中得到了String,它有多个逗号()。我想删除 最后一个逗号, 但实际上找不到一种简单的方法。 我有的: 我想要的是: 问题答案: 要删除紧随字符串结尾的部分,您可以执行以下操作: 相对于/ solution,它需要对此类情况进行特殊处理,这可以优雅地处理空列表(空字符串)。 示例代码: 注意: 由于存在有关零件的一些注释和建议的编辑:表达式应与要删除的尾部零件匹配。 如果

  • 问题内容: 我有一个像 我想把它分成那些字符串 如果我简单地打电话给我,那么在修剪之后我会得到不同的结果,因为在某些字符串中,例如,仍然有一个逗号。但我不想放在方括号中。有解决这个问题的优雅方法吗? 问题答案: 假设和没有嵌套和未转义。您可以使用以下方式进行拆分: 正则演示 如果逗号后面没有非圆括号和,则将匹配逗号,从而忽略和中的逗号。

  • 问题内容: 我有从.net应用程序A,B,C,D,E,F获取的字符串, 我想写一个SQL选择语句像 这在t-SQL中将不起作用,因为它使用不将值分开的一个字符串。有什么办法可以做到这一点? 问题答案: 它认为最简单的方法是动态SQL生成:

  • 问题内容: 如果用户定义的变量是一串用逗号分隔的数字,例如,是否可以在函数中使用它? 具体来说: 不选择t等于c等于1或2或4的行。 问题答案: 您不能直接使用变量来执行此操作。根据您现在拥有的内容,服务器正在尝试执行…显然,这不是您想要的,因为您要检查c是否包含给定的单个字符串。 您必须根据列表生成动态SQL,以使其正常工作。