很烦,奇葩点较多
数据:
一列数据值是这样的:["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 1
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 1
怎么直接发出去了,把逗号加上,分情况 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” ‘ 不就能过滤的第三条记录吗🙄还是说我忽略了什么
|