1. 程式人生 > >mysql中orderby和limit同時使用的bug

mysql中orderby和limit同時使用的bug

我的SQL很簡單
我想從一個表中檢索所有標題含有“中國”的資料,將它們按id排序,取前5條,所以我寫了以下語句
SQL語句1:

select fi_id, fi_url, fi_title
from InfoTable
where fi_title like '%中國%'
order by fi_id desc
limit 5

當我只使用order by時,能夠返回13條結果
只使用limit時,能夠返回其中的5條結果
但是當我同時使用order by和limit時,卻返回0條結果

同時我們還發現,這種情況並不是在所有檢索詞上都會出現,如把檢索詞由“中國”換為“足球”等就不會出現這種現象。

在和同事的討論中,有人提出了以下方法
SQL語句2:

select * from
(select fi_id, fi_url, fi_title
from InfoTable
where fi_title like '%中國%'
order by fi_id desc ) a
limit 5

語句2能夠正確的得到5條結果

這給了我們一些啟發:語句1和語句2的執行並不相同,所以語句1很可能與我們最初設想不符,所以,我們對語句1進行了以下修改
limit 5 ---> limit 50000

得到SQL語句3:

select fi_id, fi_url, fi_title
from InfoTable
where fi_title like '%中國%'
order by fi_id desc
limit 50000

此SQL語句能夠正確得到13條結果

由此我們推測:在同時使用order by和limit時,MySQL進行了某些優化,將語句執行邏輯從"where——order by——limit"變成了"order by——limit——where",導致在某些情況下,同時使用order by和limit會導致查無結果(或結果數量不足)。具體出現問題與否是與表中資料有關的。