0 レビュー
1 回答
php-2つの列に基づいてmysqlクエリを注文します
クエリを高速化するために、開始値として設定されている主キーid
paginate
posts.id > $start
。
これは私が通常の投稿をフェッチする方法です。つまり、id
は次のクエリリクエストで順番にフェッチされます
// start value $start = $_GET['start']; if ($start <= 0) { // set as first request $offSet = "AND posts.id > $start"; } else if ($start > 0) { // set as subsequent request $offSet = "AND posts.id < $start"; } // fetch posts $posts = $db->query("SELECT posts.id, posts.likes, posts.dislikes, posts.comments FROM posts, users WHERE posts.user_id=users.id $offSet ORDER BY posts.id DESC LIMIT 0, 15");
わからない
0
レビュー
答え :
解決:
効率的な化合物:
順序を改善するには、2列のORDER BY
そして、それはWHERE
句を複雑にします。特に、複数のアイテムが同じ数のいいねを持っている場合はそうです。
最も好きなものから始めます:
SELECT ... WHERE likes <= $leftoff_likes AND ( likes < $leftoff_likes OR id < $leftoff_id ) ORDER BY likes DESC, id DESC LIMIT 16
嫌いなものから始める:
SELECT ... WHERE likes >= $leftoff_likes AND ( likes > $leftoff_likes OR id > $leftoff_id ) ORDER BY likes ASC, id ASC LIMIT 16
現在のページに最初の15件の結果を表示し、(次回のために)16番目の項目から$ leftoff_likesと$ leftoff_idを設定します。[Next]
}ボタンと[Prev]
ボタンの後ろにあるURLを介してそれらを渡します。
OFFSET
は使用されません。
実用的な場合は、INDEX(likes, id)
(そのヒントはhttp://mysql.rjweb.org/doc.php/deletebig#iterating_through_a_compound_keyで取り上げられました)
その他の注意事項:
LIMIT
OFFSET
と一緒に使用するよりも、「中断したところを覚えておく」方がよいでしょう。参照: http://mysql.rjweb.org/doc.php/pagination
それは複数の変更になります。$offset
でパッチを適用する代わりに、2つの完全なクエリを作成することをお勧めします。
わからない
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。