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 · 5050 次点击
    这是一个创建于 1824 天前的主题,其中的信息可能已经有所发展或是发生改变。

    很烦,奇葩点较多

    数据

    一列数据值是这样的:["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   ·   实用小工具   ·   1127 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:44 · PVG 06:44 · LAX 14:44 · JFK 17:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.