2011-03-11 44 views
6

我想提出一個分頁方法,我所做的就是: 首先查詢將統計所有的結果和第二個查詢會做的正常選擇與LIMIT使用相同的查詢獲取MySQL的總數限制?

有技術上沒有辦法做到這一點我做了什麼,但只有一個查詢?

我現在擁有的一切:

SELECT count(*) from table 
SELECT * FROM table LIMIT 0,10 

回答

3

你可以用一個子查詢做到這一點:

select 
    *, 
    (select count(*) from mytable) as total 
from mytable LIMIT 0,10 

但我不認爲這有什麼樣的優勢。

編輯:就像伊利亞所說,總數和行的含義完全不同,在同一個查詢中想要檢索這些數據並沒有真正的意義。我會堅持兩個查詢。我只是給出了這個答案,以表明這是可能的,而不是它是一個好主意。

+0

這將多次返回'count(*)'的結果,寫這樣的查詢沒有意義。可悲的是,我知道一些程序員會這樣做,而不會眨眼睛。 – 2011-03-11 23:18:37

+0

這就是我說這樣做沒有優勢的原因。但是如果有一種要求在一個查詢中完成,爲什麼不呢,這不會嚴重影響性能。 – krtek 2011-03-11 23:22:08

+2

@Krtek你不是在那裏做1個查詢,但是2.子查詢或普通查詢在這裏是同樣的事情。那麼,爲什麼不只是做兩個查詢,使其更好。對於1條襯墊的要求在這裏沒有任何意義:P。您仍然有唯一的解決方案:-P – 2011-03-11 23:27:20

2

您可以運行第一個查詢,然後運行第二個查詢,因此您將同時獲得計數和第一個結果。

查詢返回一組記錄。計數絕對不是「SELECT *」查詢可以返回的記錄之一,因爲整個結果集只有一個計數。

無論如何,你沒有說你使用什麼編程語言來運行這些SQL查詢以及你正在使用什麼界面。也許這個選項存在於界面中。

3

雖然我已經看到了一些不好的做法這一點,當我已經研究過這之前有兩個常用接受的解決辦法:

  1. 運行查詢,然後用count運行相同的查詢,你已經在你的問題中完成了。

  2. 運行您的查詢,然後用SQL_CALC_FOUND_ROWS關鍵字再次運行它。

例如, SELECT SQL_CALC_FOUND_ROWS * FROM table LIMIT 0,10

第二種方法是phpMyAdmin如何做到這一點。

2

SELECT SQL_CALC_FOUND_ROWS 查詢這裏 限制...

不運行任何其他查詢或銷燬會話,然後運行 SELECT FOUND_ROWS();

,你會得到行

的總數
12

沒有人真正提到了這一點,但使用SQL_CALC_FOUND_ROWS技術的正確的做法是這樣的:

  1. 執行您的查詢:SELECT SQL_CALC_FOUND_ROWS * FROM `table` LIMIT 0, 10
  2. 然後直接運行此查詢:SELECT FOUND_ROWS()。該查詢的結果包含先前查詢的完整計數,即如果您沒有使用LIMIT子句。第二個查詢是即時快速的,因爲結果已被緩存。