› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
IMFFA
V2EX  ›  MySQL

逗号分隔的字段怎么查询

  •  
  •   IMFFA · Jun 14, 2019 · 5968 views
    This topic created in 2664 days ago, the information mentioned may be changed or developed.
    比如有一个表 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 都能匹配上
    18 replies  •  2019-06-14 16:35:24 +08:00
    yxwzaxns
        1
    yxwzaxns  
       Jun 14, 2019 via iPhone
    把 userID 的自增值设成你的系统预计服务的用户数量的值,比如 10000 能服务 10 万的用户
    hoythan
        2
    hoythan  
       Jun 14, 2019
    。。。匹配 ,6,
    niucility
        3
    niucility  
       Jun 14, 2019 via Android
    find in set
    echoway
        4
    echoway  
       Jun 14, 2019
    select * from table where ','+user_ids+',' like '%, 用户 id, %'

    SELECT * FROM table WHERE instr(','+用户 ID+',' , ','+user_ids+',' ) > 0
    aa65535
        5
    aa65535  
       Jun 14, 2019   ❤️ 3
    FIND_IN_SET()
    Chemist
        6
    Chemist  
       Jun 14, 2019
    就这么爱反范式吗。
    msg7086
        7
    msg7086  
       Jun 14, 2019
    可以把表结构转换成更人性化的结构,比如更高范式的结构。
    silentstorm
        8
    silentstorm  
       Jun 14, 2019
    这表结构设计的简直让人无话可说,而且查询速度估计也快不了。
    IMFFA
        9
    IMFFA  
    OP
       Jun 14, 2019
    @niucility @aa65535
    谢谢回复,哈哈
    find_in_set()完美解决
    IMFFA
        10
    IMFFA  
    OP
       Jun 14, 2019
    表是别人设计好的,我也没法改,本人比较菜,sql 不熟练,只好发帖请教
    @kyuuseiryuu @msg7086 @silentstorm
    XuanFei990
        11
    XuanFei990  
       Jun 14, 2019
    楼主的头像,以前一直拿来当做桌面来着。。

    只知道叫夏娜,,☺☺
    gaius
        12
    gaius  
       Jun 14, 2019
    你是用 Set 存的话,就转成对象 contains 不就行了
    opengps
        13
    opengps  
       Jun 14, 2019
    这种建议用外键存储,真要这么用的话修正下楼主的语句:
    select * from table where user_ids like '%,id,%' or user_idslike 'id,%' or user_idslike '%,id'
    注意要查询的 id 前后加逗号,另外就是,针对开头结尾需要兼容下
    IMFFA
        14
    IMFFA  
    OP
       Jun 14, 2019
    @XuanFei990
    就是夏娜,出自动漫“灼眼的夏娜”
    XuanFei990
        15
    XuanFei990  
       Jun 14, 2019
    @IMFFA 没看过 ,,只是知道名字,仅此而已☺☺
    IMFFA
        16
    IMFFA  
    OP
       Jun 14, 2019
    @opengps
    之前也考虑了 select * from table where user_ids like '%,id,%'
    但是没想到头尾兼容,发现匹配不了第一个后放弃了.....
    GGGG430
        17
    GGGG430  
       Jun 14, 2019 via iPhone
    将这种多个数字存储改成二进制形式,如要存 3,6 则改成 2∧3+2∧6 = 72,最后该字段实际存储的是 64,查阅的时候只需要在 sql 中 select 64&2∧x 即可,简单方便,缺点就是整形数字有上限
    fuxkcsdn
        18
    fuxkcsdn  
       Jun 14, 2019
    @GGGG430 mysql where 条件中用位操作不走索引,还不如用 find_in_set 或者 like
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   858 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 45ms · UTC 21:18 · PVG 05:18 · LAX 14:18 · JFK 17:18
    ♥ Do have faith in what you're doing.