2013-10-22 202 views
3

我有一個聊天系統正常工作的第一場比賽,但我只是意識到郵件列表中翻出每人每封郵件則顯示最後的結果,這顯然是一種資源和壓力的大量浪費在服務器上每個用戶只返回一個結果。MySQL查詢返回的每個結果

這是查詢消息列表,然後有一個while循環清理數組,以顯示每個用戶只有最新的消息,我知道有一個更好的方法來使用JOIN做到這一點,但我可以別把我的頭靠近了。

$result = dbconstruct("SELECT messages.id, messages.msgfrom, messages.msg, 
messages.active, messages.replied, users.username, users.online, users.admin, 
users.imagename FROM messages, users WHERE msgto='$_SESSION[id]' 
AND users.id=msgfrom ORDER by messages.id DESC"); 

我已經查看了其他答案,但如前所述,發現很難掌握連接技術。

更新

我不認爲我解釋什麼,我需要很好。目前我運行上述查詢,返回大約2000個結果,然後使用它來將每個用戶消息過濾爲單個消息。

$clean = array(); while($result->fetch_assoc()) { if(in_array($result[msgfrom],  
$clean)) { } 
else { //print message } 

$usercheck = array_push($clean, $result[msgfrom]); } 

這顯示郵件列表罰款,它只顯示從每個用戶的最後一條消息,但它是一個非常糟糕的方式這樣做。在SQL查詢中必須有一種方法來做到這一點。

+0

php代碼如何清理這個結果? –

+0

你不需要加入,但一個'LIMIT'或'ORDER'條款或雙方 – hjpotter92

回答

2

假設message.id是auto_incremented,MAX是最新的。否則,如果你有一個列作爲時間戳,你可以使用它並應用相同的原則。

我想複製你試圖在你的PHP的最準確的方式是,只選擇一個人(子查詢)的最新消息,並與你的期望輸出查詢加入。我認爲它會返回你所期望的:

SELECT m.id, 
    m.msgfrom, 
    m.msg, 
    m.active, 
    m.replied, 
    u.username, 
    u.online, 
    u.admin, 
    u.imagename 
FROM messages m 
INNER JOIN users u ON u.users.id = m.msgfrom 
INNER JOIN (SELECT MAX(id) as id, msgfrom 
      FROM messages 
      GROUP BY msgfrom 
      ) m2 
    ON m2.id = m.id AND m2.msgfrom = m.msgfrom 
WHERE messages.msgto = '$_SESSION[id]' 
+0

據我瞭解使用MAX功能,它只會返回一個值,我需要它返回MAX每每messages.msgto messages.id導致這是否有意義? –

+0

@AndrewWard。我添加了一種不同的方法,我認爲它可能更接近你想要的。 –

+0

@AndrewWard。你設法使它工作?如果不是,您可能想要顯示一些示例數據以便於幫助。 –

0

在使用聯接的情況下,您的查詢應該是這個樣子:

SELECT 
    messages.id, 
    messages.msgfrom, 
    messages.msg, 
    messages.active, 
    messages.replied, 
    users.username, 
    users.online, 
    users.admin, 
    users.imagename 
FROM 
    messages 
INNER JOIN 
    users 
ON 
    users.id = messages.msgfrom 
WHERE 
    msgto='$_SESSION[id]' 
ORDER by 
    messages.id 
DESC 

顯然,它尚未經過測試,並且你絕對應該有這樣的念想figure out which join to use.

+0

說有來自user.a 1000行有msg.to =「$ _SESSION [ID],然後user.b.相同 我希望顯示user.a和user.b的最後消息等..不必檢索所有1000條短信,顯示來自每個用戶的最後一條消息......我怎麼每個結果限制爲一行。 –

+0

@AndrewWard你應該可以投入'LIMIT 1'來檢索最新的? – Darren

+0

對不起,我不能足夠清楚,有一個來自會msg.to = $ _SESSION [ID]不同用戶的多條消息我需要爲每個用戶每個返回的最後一條消息,而不是僅僅侷限於一個結果。 –