Mysql
如果 MariaDB 使用者定義變數為空,則會引發警告
我有 2 個查詢:第一個查詢結果將使用使用者定義的變數傳遞給第二個查詢。(這個實現是因為在大規模數據庫上應用適當的索引後表的性能問題)
查詢如下所示:
SET @some_var=''; SELECT sids INTO @some_var FROM fsettings WHERE cid=1 AND tid=9 AND tp=1 AND IsDelete=0; SELECT name FROM `tlivewsts` WHERE id IN( @some_var ) ORDER BY FIELD( id, @some_var );
我在 1-2 秒內得到結果。(在 30 秒之前。)
但是,我的問題是如果第一個查詢沒有返回結果(空變數)會發生什麼。然後,第二個查詢在 mysql 中引發警告。
我的問題是:有沒有可能的方法來檢查使用者定義的變數是否不包含結果,然後直接返回“找到0個結果”?我知道這可以通過 MariaDB 中的 function/sp 來完成;我想知道是否可以使用簡單的查詢?
我已經瀏覽了WHERE 子句中的 MySQL 使用者定義變數以供參考,但沒有找到解決方案。
在下面的答案中找到一些研發後,FIND_IN_SET 工作正常。
SET @some_var=''; SET @some_var:=(SELECT sids FROM fsettings WHERE cid=1 AND tid=9 AND tp=1 AND IsDelete=0); SELECT name FROM `tlivewsts` WHERE FIND_IN_SET(id ,@some_var ) ORDER BY FIND_IN_SET(id ,@some_var );
我希望這個解決方案對像我這樣有需要的人有用:)
您可以使用 UDV 完全避免該技巧
JOIN
SELECT b.name FROM fsettings AS a JOIN tlivewsts AS b ON b.id = a.sids -- here is the replacement for UDV WHERE a.cid=1 AND a.tid=9 AND a.tp=1 AND a.IsDelete=0; ORDER BY b.id;
當然,為了獲得可接受的性能,您的表
fsettings
應該被正確索引。您需要類似的東西(sids, cid, tid, tp, IsDelete)
(欄位的順序可能會有所不同)。