RTMP推流协议视频直播点播平台/人脸识别系统EasyDSS 定制标签检索功能检索数据出错的问题排查

TSINGSEE青犀视频研发团队在EasyDSS定制项目中,应客户需求增加标签搜索功能。测试时发现查询数据与需求不匹配,经检查是数据库命令查询顺序有误,通过修改代码,在关键语句外侧添加括号,最终解决查询问题,使结果符合预期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在多年的视频解决方案开发中,TSINGSEE青犀视频研发团队碰到过很多对产品有定制需求的项目,我们也会尽力根据用户的需求对产品进行修改。

在EasyDSS的定制项目中,客户提出需求增加标签搜索功能,我们添加该功能后进行测试,发现查询出来的数据与按需求检索的数据不匹配。比如数据库中有以下数据,查询 shared 为 true,并且标签是 “天下” 或者标签是 “爱情” ,应该仅能查询出两条数据,但实际查询出三条数据。

64.png

编写测试数据,及测试代码。查询后台发出的数据库命令为:

SELECT * FROM "vod_files"  WHERE (dir_id = 'Cuwb2D2MR') AND (shared = '1') AND (labels like '%爱情;%') OR (labels like '%天下;%') ORDER BY update_at desc LIMIT 10 OFFSET 0

检查此命令,发现命令查询顺序不正确,正确的命令应该如下:

SELECT * FROM "vod_files"  WHERE (dir_id = 'Cuwb2D2MR') AND (shared = '1') AND ((labels like '%爱情;%') OR (labels like '%天下;%')) ORDER BY update_at desc LIMIT 10 OFFSET 0

关键点在于(labels like ‘%爱情;%’) OR (labels like ‘%天下;%’)这一句话,应该添加括号,否则查询的结果就是查询出所有标签是“天下”的数据了。

查看代码,关于 like 的命令为以下代码:

labelArr := estring.ArrayStrToArray(labels)
for _, label := range *labelArr {
   ors = append(ors, "labels like '%" + label + ";%'")
}

以上代码将所有 like 语句放置在 or 中,因此出现问题,即底层生成的代码为:

db.Where("labels like '%爱情;%'").Or("labels like '%天下;%'")

修改代码如下:

labelArr := estring.ArrayStrToArray(labels)
labelLike := ""
for index, label := range *labelArr {
   if index > 0 {
      labelLike = labelLike + " OR "
   }
   labelLike = labelLike + "labels like '%" + label + ";%'"
}
if labelLike != consts.EmptyString {
   wheres = append(wheres, labelLike)
}

该段代码最终生成的代码为

db.Where("labels like '%爱情;%' OR labels like '%天下;%'")

此段生成的代码会将(labels like ‘%爱情;%’) OR (labels like ‘%天下;%’)外侧再添加一段括号,因此正确。

最终测试查询结果为2条数据,解决此问题。以下为返回数据的部分截图,total 为查询到的总数量。

65.png

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值