2009-07-14 6 views
13

単純な画像ギャラリーを作成しようとしていますが、1ページに16枚の画像が表示されています。私はLIMIT 16を使用してページに正しい金額を表示していますが、16行を超える場合は、リンクを下にして、次のページに移動できるようにします。SQL Count LIMITを使用しているときのローの総数

私は限界を取り除き、単に最初の16項目を表示するためにループを使用することで希望の結果を得ることができますが、これは非効率的であることは知っています。明らかに、行数のカウントは常に16となります。

$sql .= "posts p, images im, postimages pi WHERE 
    i.active = 1 
    AND pi.post_id = p.id 
    AND pi.image_id = im.image_id 
    ORDER BY created_at LIMIT 16"; 

もっと効率的なやり方を提案する人はいますか?

おかげ

答えて

1

:1は、クエリであり、他はある

+0

+1はSQLインジェクションに関する通知です。 – andyk

3

あなたは完全にページ付け、または単にthis pagenext pageを持ってしようとしていますか?後者の場合は、単にLIMIT 17とし、結果の行を数えることができます。あなたが17を得る場合、あなたは改ページする必要があります。

3

制限なしで別のクエリを実行します。がカウントを返します。あなたは、カウントその皆を取得するための別のクエリに加えて、上にある特定のページのためのあなたの結果を相殺する必要が

SELECT COUNT(primary_key) FROM ... WHERE... 
+0

これまでの回答では、なぜこれを言っているのですか? –

+1

@timpetersonこれは有効なオプションです。データベースに2回ヒットしなければならない問題がいくつかありますが、依然として完全に有効な(効率的ではない)回答です。そして、それが効率的であれば、あなたがやっていることによっては、同じ情報を得るための2つの異なる方法を提供することによって、最高の定評がDRYに違反することがあります。 – RonLugge

0

使用の2つのクエリ、他にも言及している。

$sql .= "posts p, images im, postimages pi WHERE 
    i.active = 1 
    AND pi.post_id = p.id 
    AND pi.image_id = im.image_id 
    ORDER BY created_at 
    LIMIT ". ($page - 1) * $pagesize .", ". $pagesize; 

SQLインジェクションに関する通常の警告がここに適用されます。 MySQL

28

SELECT SQL_CALC_FOUND_ROWS 
     * 
FROM posts p, images im, postimages pi 
WHERE i.active = 1 
     AND pi.post_id = p.id 
     AND pi.image_id = im.image_id 
ORDER BY 
     created_at 
LIMIT 16; 

SELECT FOUND_ROWS(); 

最初のクエリが16行を返し、2番目のクエリはあなたが最初のクエリにはLIMIT句になることはありませ返される行の数を返します。

「次へ」リンクを表示するかどうかを決定するために使用できます。

+0

Oracleでこれを実行する同様の方法はありますか? – ria

+0

+1。 MySQL docu:[http://dev.mysql.com/doc/refman/5.6/en/information-functions.html#function_foundrows] – Wolfgang

+0

- @ Quassnoi、第1回と第2回の結果をどうやって返すのですか?クエリ?私は 'FOUND_ROWS()'の結果しか見ることができません。 –

関連する問題