很烦,奇葩点较多
数据:
一列数据值是这样的:["12","13],或者["12","14","121"],或者["13","121"],也就是我存的是数组,但是数组中值个数不一定,列名为 idList;
需求:
- 我要从前端查询这列数据,前端传的是一个 id,12 或者 13 或者 121 这些值,那么我需要先 like,再在前端判断每一个 idList 的值是否和我要求的一样,比如我传一个 12,那么 idList 1 和 2 是符合的,3 是不符合要求的。
- 同时,前端是分页,我一次假设拿 10 条数据,那么先 like 到 10 条,再去掉不符合的那几条,肯定不够 10 条了,返回的不够。
我目前的做法是:
把所有数据 like 到 set 中,再判断不符合要求的去掉,再取出 10 条,返回给前端,所幸内部项目,数据库不大,目前这样还可以,后面数据会一直增加,set 会越来越大,现在还行,后面肯定不行
想到的处理办法:
- 改数据库,可以
- 一条一条的循环,查到符合的就放 set 中,然后再查,直到拿到 10 条
不知到 set 能有多大,内存不够后面肯定不行,再建一张表也很烦,就一个字段就一张表,或者一条一条查,频繁查询数据库也不好吧,内部项目,几百用户
能不能给点意见,最好能涨见识的,没大佬带,只有靠网友带了-_-
![]() | 1 18258226728 2019-11-29 11:27:06 +08:00 ![]() select * from table where id_list like '%,12,%' or id_list like '12,%' or id_list like '%,12' |
![]() | 2 18258226728 2019-11-29 11:27:35 +08:00 ![]() 怎么直接发出去了,把逗号加上,分情况 like,这样行不 |
![]() | 3 Beeethoven 2019-11-29 11:50:10 +08:00 select * from table where id_list like concat('%"',12,'"%'); |
![]() | 4 wangyzj 2019-11-29 12:49:06 +08:00 数据库设计 many to one 关系错了 改表吧 否则早晚都是个事 |
![]() | 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 查找即可了。 |
![]() | 6 markgor 2019-11-29 13:04:16 +08:00 MYSQL 的 JSON 形式我用,不知道如何,所以不敢建。 但是你可以再後端把字符,用逗分割。 使用的候通 find_in_set 查找。 但是得,find_in_set 面不要再套子查,否性能能你哭. |
![]() | 7 1ffree 2019-11-29 15:43:26 +08:00 mysql 不适合吧 |
![]() | 8 gaius 2019-11-29 15:45:40 +08:00 简单点可以存 JSON,用 contains |
![]() | 9 changdy 2019-11-29 16:05:14 +08:00 正好 借楼问下 .在 mysql 中 如果 json 存了数组 , 那应该如何判断数组中是否存在某个值 比如 判断[1,2,3,4,5](长度不定) 中是否包含 7 |
11 vinHty 2019-11-29 16:41:22 +08:00 貌似一楼的 SQL 可以解决 不过可能要把 or 改成 union 的方式 |
12 gavindexu 2019-11-29 16:49:09 +08:00 via iPhone 用 5 楼的 find_in_set 吧, 尽快改表才是正道。 或者存 json 用 json_extract ? |
13 alexk 2019-11-29 16:58:44 +08:00 拆个子表吧,不然迟早搞出事来 |
![]() | 14 gaius 2019-11-29 17:07:13 +08:00 {"a": [1, 2, 3]} SELECT * FROM `t` WHERE JSON_CONTAINS(x_column, '1','$.a') 大概就这样,具体可以查下文档 |
![]() | 15 l8g 2019-11-29 17:08:13 +08:00 如果要在字段上查询的,一般不建议包成这样塞到一个字段里,拆个关联表会好很多。 |
16 EminemW 2019-12-01 02:23:55 +08:00 via iPhone 这一列的数据存到另一个表里,比如[1,2,3]就对应 3 条记录。另外 原来的做法 like ‘ “12” ‘ 不就能过滤的第三条记录吗还是说我忽略了什么 |