limit
簡単なページネーションを作成しようとしていますが、結果の数に失敗しているようです。
SELECT * FROM visits GROUP by clientID ORDER BY 'date' LIMIT $from, $to
すべてのクライアントの最初の訪問のみを(時系列で)取得し、結果をページングしたいと思います。
$ from = 6、$ to = 12でこのクエリを実行すると、7行ではなく8行のように返されます。
私が間違っているのは何ですか?
MySQLのdocsonLIMIT
句から
LIMIT句を使用して、SELECTステートメントによって返される行数を制限できます。LIMITは、1つまたは2つの数値引数を取ります。これらは両方とも非負の整数定数でなければなりません(プリペアドステートメントを使用する場合を除く)。
2つの引数を使用すると、最初の引数は返される最初の行のオフセットを指定し、2番目の引数は返される行の最大数を指定します。最初の行のオフセットは0です(1ではありません)。
$from
6と$to
12を選択した場合。6から12までを選択していません。=7から始まる12行を選択します。$from + 1
LIMIT cluaseの最初の引数は開始オフセットであり、2番目の引数は返される行数です。したがって、クエリは次のようになります。
... LIMIT $from, ($to - $from)
使用しているdbmsと構文では、limit式の2番目の数値は、オフセットエンドポイントではなく、許可される結果の数です。つまり、6から始めて、次の12の結果を許可し、結果6〜12は取得しません。
結果を6〜12にしたい場合は、limit 5,7
クエリは、日付による最初の訪問を返しません。これを行うには、実際にこの情報に参加する必要があります。
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(mis)機能を使用しているためです。この機能では、句に含まれておらず、集計関数の引数ではselect
ない列を句に含めることができます。group by