Mysql

如果 MariaDB 使用者定義變數為空,則會引發警告

  • January 31, 2019

我有 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)(欄位的順序可能會有所不同)。

引用自:https://dba.stackexchange.com/questions/227972