您当前的位置: 首页 >  sql

ITKEY_

暂无认证

  • 0浏览

    0关注

    732博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

mysql字段userid逗号分开保存按userid查询

ITKEY_ 发布时间:2022-07-02 23:30:00 ,浏览量:0

我的sql水平一般,仅是一个笔记。无法保存是最优解。仅供参考。

场景

有一张消息表,其中有一个收信人字段中把多个用户以,分隔保存信息。我需要根据userid来查询信息。为了方便理解,我减化一下表结构。我的表结构如下:

message_idreceiversendermessagecreate_time1user1,user2systemhello2022-06-30 16:30:122user1,user3systemworld2022-06-30 16:31:193user3,user4,user5user1java2022-06-30 16:31:224user7,user8user2neovim2022-06-30 16:31:535itkey,lxyoucansystemitkey2022-06-30 16:32:176user,user11goodvery2022-06-30 16:38:18 表结构
create table t_message
(
    message_id     bigint auto_increment comment '消息ID'
        primary key,
    receiver       varchar(4000)    null comment '收件人',
    sender         varchar(200)     not null comment '发件人',
    message        varchar(4000)    not null comment '消息内容',
    create_time    datetime         null comment '创建时间'
)
    comment '消息中心';
数据
INSERT INTO t_message (message_id, receiver, sender, message, create_time) VALUES (1, 'user1,user2', 'system', 'hello', '2022-06-30 16:30:12');
INSERT INTO t_message (message_id, receiver, sender, message, create_time) VALUES (2, 'user1,user3', 'system', 'world', '2022-06-30 16:31:19');
INSERT INTO t_message (message_id, receiver, sender, message, create_time) VALUES (3, 'user3,user4,user5', 'user1', 'java', '2022-06-30 16:31:22');
INSERT INTO t_message (message_id, receiver, sender, message, create_time) VALUES (4, 'user7,user8', 'user2', 'neovim', '2022-06-30 16:31:53');
INSERT INTO t_message (message_id, receiver, sender, message, create_time) VALUES (5, 'itkey,lxyoucan', 'system', 'itkey', '2022-06-30 16:32:17');
INSERT INTO t_message (message_id, receiver, sender, message, create_time) VALUES (6, 'user,user11', 'good', 'very', '2022-06-30 16:38:18');
实践 [错误的示范]like模糊匹配

首先我第一个思路想到的是使用like语句进行模糊查询。看似简单易用,但是会有bug。

比如查询user3

select * from t_message where receiver like '%user3%';
message_idreceiversendermessagecreate_time2user1,user3systemworld2022-06-30 16:31:193user3,user4,user5user1java2022-06-30 16:31:22

没有任何问题,但如果我要查询user用户的数据呢?

select * from t_message where receiver like '%user%';
message_idreceiversendermessagecreate_time1user1,user2systemhello2022-06-30 16:30:122user1,user3systemworld2022-06-30 16:31:193user3,user4,user5user1java2022-06-30 16:31:224user7,user8user2neovim2022-06-30 16:31:536user,user11goodvery2022-06-30 16:38:18

发现此时查询的数据就不准备了,userid越是短的,查的越不精确。

可行的办法

首先说明,可能不是最好的解决办法,仅供参考。如果您有更好的办法,欢迎评论区交流。

help_topic

开始之前我们先简答的了解一下help_topic,主要是用来把一行变成多行的。

select substring_index(substring_index('82,83,84,85,86', ',', help_topic_id + 1), ',', -1) as Id
from mysql.help_topic
where help_topic_id             
关注
打赏
1665243900
查看更多评论
0.0401s