逗号分隔的字段怎么查询

2019-06-14 13:26:01 +08:00
 IMFFA
比如有一个表 table 里面有个 user_ids 字段是这么储存的 1,2,5,7,12,16,25,26,27
那我怎么去匹配当前登录用户的 id 是否在其中呢
我尝试了 select * from table where user_ids like '% 用户 id %'
可是这样的话如果用户 id 是 6,那么 16 和 26 都能匹配上
4784 次点击
所在节点    MySQL
18 条回复
yxwzaxns
2019-06-14 13:32:37 +08:00
把 userID 的自增值设成你的系统预计服务的用户数量的值,比如 10000 能服务 10 万的用户
hoythan
2019-06-14 13:34:42 +08:00
。。。匹配 ,6,
niucility
2019-06-14 13:36:46 +08:00
find in set
echoway
2019-06-14 13:37:16 +08:00
select * from table where ','+user_ids+',' like '%, 用户 id, %'

SELECT * FROM table WHERE instr(','+用户 ID+',' , ','+user_ids+',' ) > 0
aa65535
2019-06-14 13:38:30 +08:00
FIND_IN_SET()
kyuuseiryuu
2019-06-14 13:47:16 +08:00
就这么爱反范式吗。
msg7086
2019-06-14 13:50:11 +08:00
可以把表结构转换成更人性化的结构,比如更高范式的结构。
silentstorm
2019-06-14 14:02:42 +08:00
这表结构设计的简直让人无话可说,而且查询速度估计也快不了。
IMFFA
2019-06-14 14:06:11 +08:00
@niucility @aa65535
谢谢回复,哈哈
find_in_set()完美解决
IMFFA
2019-06-14 14:07:26 +08:00
表是别人设计好的,我也没法改,本人比较菜,sql 不熟练,只好发帖请教
@kyuuseiryuu @msg7086 @silentstorm
XuanFei990
2019-06-14 14:12:01 +08:00
楼主的头像,以前一直拿来当做桌面来着。。

只知道叫夏娜,,☺☺
gaius
2019-06-14 14:13:56 +08:00
你是用 Set 存的话,就转成对象 contains 不就行了
opengps
2019-06-14 14:15:49 +08:00
这种建议用外键存储,真要这么用的话修正下楼主的语句:
select * from table where user_ids like '%,id,%' or user_idslike 'id,%' or user_idslike '%,id'
注意要查询的 id 前后加逗号,另外就是,针对开头结尾需要兼容下
IMFFA
2019-06-14 14:37:56 +08:00
@XuanFei990
就是夏娜,出自动漫“灼眼的夏娜”
XuanFei990
2019-06-14 14:39:27 +08:00
@IMFFA 没看过 ,,只是知道名字,仅此而已☺☺
IMFFA
2019-06-14 14:41:23 +08:00
@opengps
之前也考虑了 select * from table where user_ids like '%,id,%'
但是没想到头尾兼容,发现匹配不了第一个后放弃了.....
GGGG430
2019-06-14 15:10:53 +08:00
将这种多个数字存储改成二进制形式,如要存 3,6 则改成 2∧3+2∧6 = 72,最后该字段实际存储的是 64,查阅的时候只需要在 sql 中 select 64&2∧x 即可,简单方便,缺点就是整形数字有上限
fuxkcsdn
2019-06-14 16:35:24 +08:00
@GGGG430 mysql where 条件中用位操作不走索引,还不如用 find_in_set 或者 like

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/573915

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX