2013-01-01 34 views
0

我使用PHP,MySQL的下列
我有兩個表從一個小桌子和一個大表

  1. 用戶
  2. users_messages

表「用戶優化選擇查詢「存儲所有用戶的記錄。

 
id name password 
1 XYZ XYZ 

[這裏ID其實就是USER_ID]

表 「信息」 包含用戶發佈的

 
id user_id messages 
1 1  XYZ 

「用戶」 表中包含成千上萬的記錄(> 5000)
消息 「users_messages」包含大約100條記錄(將保持不同)

我想獲取所有用戶的消息no並在一張桌子上展示出來。 目前我正在嘗試對它們進行分頁,因此我只需要一個頁面加載的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個用戶的信息。

表「用戶」的id列不是從1開始,開始是隨機的,但它會自動從下一條記錄遞增。

+0

看看索引是對用戶表啓用。介紹「解釋用戶」的輸出? – traditional

回答

0

表「用戶」的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; 
+0

如何使用'distinct u.username'和'count count(u.id)= 20'? – bonCodigo

+0

他正在尋找'LIMIT 20'作爲分頁而不是'HAVING'子句,是的它可能需要使用'DISTINCT。 –

+0

謝謝@mahmoud,這真的優化了查詢...... :) –

相關問題