MySQL中使用自定義變量 編寫偷懶的UNION示例
更新時(shí)間:2013年07月29日 08:50:43 作者:
以下是對(duì)MySQL中使用自定義變量,編寫一個(gè)UNION的示例進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下
(參考自<<高性能MySQL>>)
假設(shè)有這樣的需求:寫一個(gè)UNION查詢,其第一個(gè)子查詢作為分支先執(zhí)行,如果找到了匹配的行,則不再執(zhí)行第二個(gè)分支的查詢。
一般來說,我們可以寫出這樣的UNION查詢:
復(fù)制代碼 代碼如下:
select id from users where id=123456
union all
select id from users_archived where id = 123456;
此查詢可以正常運(yùn)行,但是無論在users表中是否找到記錄,都會(huì)到users_archived表中掃描一次;因此可能也會(huì)返回重復(fù)的記錄。為了減少這種情況下不必要的開銷,SQL語句可以寫成這樣:
復(fù)制代碼 代碼如下:
SELECT GREATEST(@found := -1, id) AS id, 'users' AS which_tbl
FROM users WHERE id = 1
UNION ALL
SELECT id, 'users_archived'
FROM users_archived WHERE id = 1 and @found IS NULL
UNION ALL
SELECT 1, 'reset' FROM DUAL WHERE (@found := NULL) IS NOT NLL;
上面的查詢用到了自定義變量@found,通過在結(jié)果列中做一次賦值并且放在GREATEST函數(shù)中,以避免返回額外的數(shù)據(jù)。如果第一個(gè)分支查詢結(jié)果集為NULL,那@found自然也還是NULL,因此會(huì)執(zhí)行第二個(gè)分支查詢。另外,為了不影響后面的遍歷結(jié)果,在查詢的末尾將@found重置為NULL。
另外, 返回的第二列數(shù)據(jù)是為了說明這條記錄是在users表還是在users_archived表中查詢得到的。
相關(guān)文章
基于mysql實(shí)現(xiàn)group by取各分組最新一條數(shù)據(jù)
這篇文章主要介紹了基于mysql實(shí)現(xiàn)group by取各分組最新一條數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
MySql 5.7.20安裝及data和my.ini文件的配置
本文通過圖文并茂的形式給大家介紹了MySql 5.7.20安裝及data和my.ini文件的配置方法,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2017-11-11
MySQL按常規(guī)排序、自定義排序和按中文拼音字母排序的方法
MySQL常規(guī)排序、自定義排序和按中文拼音字母排序,在實(shí)際的SQL編寫時(shí),我們有時(shí)候需要對(duì)條件集合進(jìn)行排序。下面給出3種比較常用的排序方式,一起看看吧2017-04-04
MySQL 處理重復(fù)數(shù)據(jù)的方法(防止、刪除)
這篇文章主要介紹了MySQL 處理重復(fù)數(shù)據(jù)的方法,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07

