ポストのようなステータスを保持するテーブルがあります。表の列は次のとおりです。
ID //which is unique incremental
Post_id //liked post
user_id //user who gave like or dislike
type //"1","0" or "2" which stands for Liked, neutral or disliked.
ここにサンプルデータがあります
+--------+---------+---------+------+
| id | post_id | user_id | type |
+--------+---------+---------+------+
| 938300 | 347298 | 661 | 0 |
| 938299 | 346185 | 0 | 1 |
| 938298 | 347286 | 2645 | 0 |
| 938297 | 346924 | 374 | 1 |
| 938296 | 347261 | 1523 | 1 |
| 938295 | 347313 | 3233 | 1 |
| 938294 | 346323 | 1375 | 1 |
| 938293 | 347022 | 1779 | 1 |
| 938292 | 347278 | 2645 | 1 |
| 938291 | 347300 | 109 | 1 |
+--------+---------+---------+------+
10 rows in set (0.01 sec)
ただし、このクエリは問題なく実行されますが、ご覧のとおり、このテーブルには何百ものデータがあります。私が必要なのは:
SELECT post_id,
count(post_id)
FROM 'table'
WHERE type = '1'
GROUP BY post_id
ORDER BY count(post_id)
LIMIT 300;
このクエリは、最も高く評価された 300 件の投稿を選択し、php コードはその中からランダムに 1 つを選択します。ただし、このクエリには全テーブル スキャンがあり、5 秒以上処理されます。どうすればこれを高速化できますか、またはテーブルスキームを変更する必要がありますか?