V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
? 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
yinzhong
V2EX  ?  MySQL

菜鸟询问关于 mysql 取值的奇葩问题

  •  1
     
  •   yinzhong · 2019-11-29 10:59:04 +08:00 · 4839 次点击
    这是一个创建于 1617 天前的主题,其中的信息可能已经有所发展或是发生改变。

    腾讯云最新优惠活动来了:云产品限时1折,云服务器低至88元/年 ,点击这里立即抢购:9i0i.cn/qcloud,更有2860元代金券免费领取,付款直接抵现金用,点击这里立即领取:9i0i.cn/qcloudquan

    (福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

    很烦,奇葩点较多

    数据

    一列数据值是这样的:["12","13],或者["12","14","121"],或者["13","121"],也就是我存的是数组,但是数组中值个数不一定,列名为 idList;

    需求:

    1. 我要从前端查询这列数据,前端传的是一个 id,12 或者 13 或者 121 这些值,那么我需要先 like,再在前端判断每一个 idList 的值是否和我要求的一样,比如我传一个 12,那么 idList 1 和 2 是符合的,3 是不符合要求的。
    2. 同时,前端是分页,我一次假设拿 10 条数据,那么先 like 到 10 条,再去掉不符合的那几条,肯定不够 10 条了,返回的不够。

    我目前的做法是:

    把所有数据 like 到 set 中,再判断不符合要求的去掉,再取出 10 条,返回给前端,所幸内部项目,数据库不大,目前这样还可以,后面数据会一直增加,set 会越来越大,现在还行,后面肯定不行

    想到的处理办法:

    1. 改数据库,可以
    2. 一条一条的循环,查到符合的就放 set 中,然后再查,直到拿到 10 条

    不知到 set 能有多大,内存不够后面肯定不行,再建一张表也很烦,就一个字段就一张表,或者一条一条查,频繁查询数据库也不好吧,内部项目,几百用户

    能不能给点意见,最好能涨见识的,没大佬带,只有靠网友带了-_-

    16 条回复  ?  2019-12-01 02:23:55 +08:00
    18258226728
        1
    18258226728  
       2019-11-29 11:27:06 +08:00   ?? 1
    select * from table where id_list like '%,12,%' or id_list like '12,%' or id_list like '%,12'
    18258226728
        2
    18258226728  
       2019-11-29 11:27:35 +08:00   ?? 1
    怎么直接发出去了,把逗号加上,分情况 like,这样行不
    Beeethoven
        3
    Beeethoven  
       2019-11-29 11:50:10 +08:00
    select * from table where id_list like concat('%"',12,'"%');
    wangyzj
        4
    wangyzj  
       2019-11-29 12:49:06 +08:00
    数据库设计 many to one 关系错了
    改表吧
    否则早晚都是个事
    markgor
        5
    markgor  
       2019-11-29 12:59:23 +08:00
    1、mysql 新版本支持 JSON 查詢
    2、在不支持 JSON 查詢的 MYSQL 裡,為什麼要 JSON 形式保存結果,改為 12,14,121 這樣插入不行嗎?
    如果是 12,14,121 這形式插入,直接用 FIND_IN_SET 來查找即可了。
    markgor
        6
    markgor  
       2019-11-29 13:04:16 +08:00
    MYSQL 的 JSON 形式我沒用過,不知道如何,所以不敢給建議。
    但是你可以再後端把數組轉為字符,用逗號分割。
    使用的時候通過 find_in_set 來查找。

    但是記得,find_in_set 裡面不要再套子查詢,否則性能能讓你哭.
    1ffree
        7
    1ffree  
       2019-11-29 15:43:26 +08:00
    mysql 不适合吧
    gaius
        8
    gaius  
       2019-11-29 15:45:40 +08:00
    简单点可以存 JSON,用 contains
    changdy
        9
    changdy  
       2019-11-29 16:05:14 +08:00
    正好 借楼问下 .在 mysql 中 如果 json 存了数组 , 那应该如何判断数组中是否存在某个值
    比如 判断[1,2,3,4,5](长度不定) 中是否包含 7
    changdy
        10
    changdy  
       2019-11-29 16:07:37 +08:00
    @gaius 大佬 要不说下 这种用什么查询 .貌似没找到...
    vinHty
        11
    vinHty  
       2019-11-29 16:41:22 +08:00
    貌似一楼的 SQL 可以解决 不过可能要把 or 改成 union 的方式
    gavindexu
        12
    gavindexu  
       2019-11-29 16:49:09 +08:00 via iPhone
    用 5 楼的 find_in_set 吧,
    尽快改表才是正道。
    或者存 json 用 json_extract ?
    alexk
        13
    alexk  
       2019-11-29 16:58:44 +08:00
    拆个子表吧,不然迟早搞出事来
    gaius
        14
    gaius  
       2019-11-29 17:07:13 +08:00
    {"a": [1, 2, 3]}
    SELECT * FROM `t` WHERE JSON_CONTAINS(x_column, '1','$.a')
    大概就这样,具体可以查下文档
    l8g
        15
    l8g  
       2019-11-29 17:08:13 +08:00
    如果要在字段上查询的,一般不建议包成这样塞到一个字段里,拆个关联表会好很多。
    EminemW
        16
    EminemW  
       2019-12-01 02:23:55 +08:00 via iPhone
    这一列的数据存到另一个表里,比如[1,2,3]就对应 3 条记录。另外 原来的做法 like ‘ “12” ‘ 不就能过滤的第三条记录吗?还是说我忽略了什么
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   938 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 18:55 · PVG 02:55 · LAX 11:55 · JFK 14:55
    Developed with CodeLauncher
    ? Do have faith in what you're doing.


    http://www.vxiaotou.com