MySQL中使用自定義變量 編寫偷懶的UNION示例
更新時間:2013年07月29日 08:50:43 作者:
以下是對MySQL中使用自定義變量,編寫一個UNION的示例進行了詳細的介紹,需要的朋友可以過來參考下
(參考自<<高性能MySQL>>)
假設有這樣的需求:寫一個UNION查詢,其第一個子查詢作為分支先執(zhí)行,如果找到了匹配的行,則不再執(zhí)行第二個分支的查詢。
一般來說,我們可以寫出這樣的UNION查詢:
復制代碼 代碼如下:
select id from users where id=123456
union all
select id from users_archived where id = 123456;
此查詢可以正常運行,但是無論在users表中是否找到記錄,都會到users_archived表中掃描一次;因此可能也會返回重復的記錄。為了減少這種情況下不必要的開銷,SQL語句可以寫成這樣:
復制代碼 代碼如下:
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ù)。如果第一個分支查詢結(jié)果集為NULL,那@found自然也還是NULL,因此會執(zhí)行第二個分支查詢。另外,為了不影響后面的遍歷結(jié)果,在查詢的末尾將@found重置為NULL。
另外, 返回的第二列數(shù)據(jù)是為了說明這條記錄是在users表還是在users_archived表中查詢得到的。
相關(guān)文章
MySQL數(shù)據(jù)庫重命名的快速且安全方法(3種)
這篇文章主要介紹了MySQL數(shù)據(jù)庫重命名的快速且安全方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12mysql如何查詢兩個日期之間最大的連續(xù)登錄天數(shù)
在現(xiàn)在的很多網(wǎng)站中都有這樣一個功能。記錄用戶的連續(xù)登陸天數(shù),所謂的連續(xù)在線是指相鄰兩天都登錄過,不一定一直在線,但是只要有過登錄即可。這篇文章主要介紹的是利用sql語句如何查詢在兩個日期之間最大的連續(xù)登錄天數(shù),有需要的朋友們下面來一起看看吧。2016-10-10