3

私は問題なく動作するチャット システムを持っていますが、私が気付いたメッセージ リストは、1 人あたりのすべてのメッセージを取得し、最後の結果を表示します。これは明らかにリソースの大量の浪費であり、ユーザーごとに 1 つの結果のみを返すためにサーバーにストレスを与えます。

これはメッセージ リストを取得するためのクエリです。その後、ユーザーごとに最新のメッセージのみを表示するために配列をクリーンアップする 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 件の結果を返し、これを使用して各ユーザー メッセージを 1 つのメッセージにフィルター処理しています。

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

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

これにより、メッセージ リストが適切に表示され、各ユーザーからの最後のメッセージのみが表示されますが、これは非常に悪い方法です。SQL クエリ内でこれを行う方法が必要です。

4

2 に答える 2

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]'
于 2013-10-22T01:46:11.213 に答える
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

明らかにテストされていないため、これを読んで、どの結合を使用するかを判断する必要があります。

于 2013-10-22T01:45:18.443 に答える