MySQL中使用自定義變量 編寫(xiě)偷懶的UNION示例
(參考自<<高性能MySQL>>)
假設(shè)有這樣的需求:寫(xiě)一個(gè)UNION查詢(xún),其第一個(gè)子查詢(xún)作為分支先執(zhí)行,如果找到了匹配的行,則不再執(zhí)行第二個(gè)分支的查詢(xún)。
一般來(lái)說(shuō),我們可以寫(xiě)出這樣的UNION查詢(xún):
select id from users where id=123456
union all
select id from users_archived where id = 123456;
此查詢(xún)可以正常運(yùn)行,但是無(wú)論在users表中是否找到記錄,都會(huì)到users_archived表中掃描一次;因此可能也會(huì)返回重復(fù)的記錄。為了減少這種情況下不必要的開(kāi)銷(xiāo),SQL語(yǔ)句可以寫(xiě)成這樣:
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;
上面的查詢(xún)用到了自定義變量@found,通過(guò)在結(jié)果列中做一次賦值并且放在GREATEST函數(shù)中,以避免返回額外的數(shù)據(jù)。如果第一個(gè)分支查詢(xún)結(jié)果集為NULL,那@found自然也還是NULL,因此會(huì)執(zhí)行第二個(gè)分支查詢(xún)。另外,為了不影響后面的遍歷結(jié)果,在查詢(xún)的末尾將@found重置為NULL。
另外, 返回的第二列數(shù)據(jù)是為了說(shuō)明這條記錄是在users表還是在users_archived表中查詢(xún)得到的。
相關(guān)文章
MySQL學(xué)習(xí)第二天 安裝和配置mysql winx64
MySQL學(xué)習(xí)第二天,主要為大家詳細(xì)介紹了在Windows 64位操作系統(tǒng)下安裝和配置MySQL的具體步驟,整理一份mysql winx64安裝配置方法教程,感興趣的小伙伴們可以參考一下2016-05-05基于sql語(yǔ)句的一些常用語(yǔ)法積累總結(jié)
本篇文章是對(duì)一些常用的sql語(yǔ)句進(jìn)行了總結(jié)與分析,需要的朋友參考下2013-06-06MySQL綠色版設(shè)置編碼以及1067錯(cuò)誤詳解
這篇文章主要介紹了MySQL綠色版設(shè)置編碼,以及1067錯(cuò)誤的相關(guān)資料,需要的朋友可以參考下2017-05-05實(shí)現(xiàn)mysql級(jí)聯(lián)復(fù)制的方法示例
這篇文章主要介紹了實(shí)現(xiàn)mysql級(jí)聯(lián)復(fù)制的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05MySQL數(shù)據(jù)庫(kù)重命名的快速且安全方法(3種)
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)重命名的快速且安全方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12mysql如何查詢(xún)兩個(gè)日期之間最大的連續(xù)登錄天數(shù)
在現(xiàn)在的很多網(wǎng)站中都有這樣一個(gè)功能。記錄用戶(hù)的連續(xù)登陸天數(shù),所謂的連續(xù)在線(xiàn)是指相鄰兩天都登錄過(guò),不一定一直在線(xiàn),但是只要有過(guò)登錄即可。這篇文章主要介紹的是利用sql語(yǔ)句如何查詢(xún)?cè)趦蓚€(gè)日期之間最大的連續(xù)登錄天數(shù),有需要的朋友們下面來(lái)一起看看吧。2016-10-10