› 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 · Nov 29, 2019 · 6401 views
    This topic created in 2503 days ago, the information mentioned may be changed or developed.

    很烦,奇葩点较多

    数据:

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

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