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

2019-11-29 10:59:04 +08:00
 yinzhong

很烦,奇葩点较多

数据

一列数据值是这样的:["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 能有多大,内存不够后面肯定不行,再建一张表也很烦,就一个字段就一张表,或者一条一条查,频繁查询数据库也不好吧,内部项目,几百用户

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

5081 次点击
所在节点    MySQL
16 条回复
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'
18258226728
2019-11-29 11:27:35 +08:00
怎么直接发出去了,把逗号加上,分情况 like,这样行不
Beeethoven
2019-11-29 11:50:10 +08:00
select * from table where id_list like concat('%"',12,'"%');
wangyzj
2019-11-29 12:49:06 +08:00
数据库设计 many to one 关系错了
改表吧
否则早晚都是个事
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
2019-11-29 13:04:16 +08:00
MYSQL 的 JSON 形式我沒用過,不知道如何,所以不敢給建議。
但是你可以再後端把數組轉為字符,用逗號分割。
使用的時候通過 find_in_set 來查找。

但是記得,find_in_set 裡面不要再套子查詢,否則性能能讓你哭.
1ffree
2019-11-29 15:43:26 +08:00
mysql 不适合吧
gaius
2019-11-29 15:45:40 +08:00
简单点可以存 JSON,用 contains
changdy
2019-11-29 16:05:14 +08:00
正好 借楼问下 .在 mysql 中 如果 json 存了数组 , 那应该如何判断数组中是否存在某个值
比如 判断[1,2,3,4,5](长度不定) 中是否包含 7
changdy
2019-11-29 16:07:37 +08:00
@gaius 大佬 要不说下 这种用什么查询 .貌似没找到...
vinHty
2019-11-29 16:41:22 +08:00
貌似一楼的 SQL 可以解决 不过可能要把 or 改成 union 的方式
gavindexu
2019-11-29 16:49:09 +08:00
用 5 楼的 find_in_set 吧,
尽快改表才是正道。
或者存 json 用 json_extract ?
alexk
2019-11-29 16:58:44 +08:00
拆个子表吧,不然迟早搞出事来
gaius
2019-11-29 17:07:13 +08:00
{"a": [1, 2, 3]}
SELECT * FROM `t` WHERE JSON_CONTAINS(x_column, '1','$.a')
大概就这样,具体可以查下文档
l8g
2019-11-29 17:08:13 +08:00
如果要在字段上查询的,一般不建议包成这样塞到一个字段里,拆个关联表会好很多。
EminemW
2019-12-01 02:23:55 +08:00
这一列的数据存到另一个表里,比如[1,2,3]就对应 3 条记录。另外 原来的做法 like ‘ “12” ‘ 不就能过滤的第三条记录吗🙄还是说我忽略了什么

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/624218

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX