在多年的視頻解決方案開發中,TSINGSEE青犀視頻研發團隊碰到過很多對產品有定制需求的專案,我們也會盡力根據用戶的需求對產品進行修改,
在EasyDSS的定制專案中,客戶提出需求增加標簽搜索功能,我們添加該功能后進行測驗,發現查詢出來的資料與按需求檢索的資料不匹配,比如資料庫中有以下資料,查詢 shared 為 true,并且標簽是 “天下” 或者標簽是 “愛情” ,應該僅能查詢出兩條資料,但實際查詢出三條資料,

撰寫測驗資料,及測驗代碼,查詢后臺發出的資料庫命令為:
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 為查詢到的總數量,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/230366.html
標籤:其他
上一篇:視頻編碼入坑指南
下一篇:2020-12-04
