0

私は PHP 、 MySQL を次の目的で使用して
います 2つのテーブルが あります

  1. ユーザー
  2. users_messages

テーブル "users" には、すべてのユーザーのレコードが格納されます。

id 名前 パスワード
1 XYZ XYZ

[ここの id は実際には user_id です]

テーブル「messages」には、ユーザーが投稿したメッセージが含まれています

id user_id メッセージ
1 1 XYZ

"users" テーブルには数千のレコード (>5000)
が含まれています "users_messages" には約 100 のレコードが含まれています (変化し続けます)

すべてのユーザーのメッセージ数を取得して、表に表示しようとしています。現在、私はそれらをページネーションしようとしているので、1ページの読み込みで20人のユーザーしか必要ありません。

次のようなクエリがあります

SELECT u.username as username,u.id as id, COUNT( f.user_id ) AS no_of_messages 
FROM users AS u
LEFT JOIN users_messages AS f ON f.user_id = u.id
GROUP BY u.id LIMIT 20

これは機能しますが、長い時間がかかります... 20 人のユーザーのみのメッセージ数を取得するためだけにテーブル全体をスキャンする可能性があります。

テーブル「users」の id 列は 1 から開始されません。開始はランダムですが、次のレコードから自動的にインクリメントされます。

4

1 に答える 1

0

テーブル「users」の id 列は 1 から開始されません。開始はランダムです

代わりにこれを試してください:

SELECT 
  u.username as username, 
  u.id as id, 
  f.no_of_messages 
FROM users AS u
LEFT JOIN
(
   SELECT user_id, COUNT(*) no_of_messages 
   FROM users_messages
   GROUP BY user_id
) AS f ON f.user_id = u.id
ORDER BY u.id
LIMIT 20;
于 2013-01-01T13:46:04.600 に答える