2013-02-25 131 views
4

我正在嘗試創建一個簡單的分頁,但它似乎無法獲得結果的數目limitSQL限制組的數量

SELECT * FROM visits GROUP by clientID ORDER BY 'date' LIMIT $from, $to 

我只想得到每個客戶端的第一次訪問(按時間順序),並對結果進行分頁。

如果我就與這個$查詢從= 6,$爲= 12返回像8行,而不是7

我做錯了什麼?

+3

如果列出DBMS和版本,它可能會有所幫助。 – 2013-02-25 21:32:33

+0

MySQL ver 5.5.24 – Cristy 2013-02-25 21:33:13

回答

6

從MySQL的文檔上LIMIT條款

LIMIT子句可以被用來限制SELECT語句返回的行數。 LIMIT需要一個或兩個數字參數,它們都必須是非負整數常量(除了使用預準備語句時)。

隨着兩個參數,第一個參數指定的第一行的偏移量返回,並且秒指定行的最大數目返回。初始行的偏移量是0(不是1)。

當您選擇$from爲6和$to爲12;你沒有選擇從6到12;你會選擇行,從$from + 1 = 7

+0

我的整個生活都是一個謊言:( – Cristy 2013-02-25 21:43:11

+0

@Cristy今天我有一個類似的經歷,但積分雖然!:P – hjpotter92 2013-02-25 21:43:53

2

LIMIT cluase的第一個參數是起始偏移量,第二個參數是要返回的行數。 因此您的查詢應該是:

... LIMIT $from, ($to - $from) 
2

與DBMS和你正在使用的語法,在限制言論自由的第二個數字是允許的,不能抵消終點結果的數量。所以你從6開始,允許接下來的12個結果,而不是6-12的結果。

如果你想要得到的結果6-12,使用limit 5,7

1

開始您的查詢不返回日期的首次訪問。要做到這一點,你需要真正加入這些信息:

select v.* 
from visits v join 
    (select clientid, MIN(date) as mindate 
     from visits 
     group by clientid 
    ) vd 
    on v.clientid = vd.clientid and v.date = vd.date 
order by clientid 
limit $from - 1, $to - $from 

您最初的查詢返回關於給定客戶端的任意一組列。這些列甚至不保證來自相同的記錄。這是因爲您正在使用MySQL(錯誤)功能,您可以在select子句中包含不在group by子句中的列,而不是聚合函數的參數。

+0

哦,但它似乎工作正常。 – Cristy 2013-02-25 22:04:41