2

チャット ツールを開発していますが、SQL が group by と order by で正しい結果を返すことに問題があります。テーブルの構造は次のとおりです。

テーブル名: チャット

id | from | to | sent | read | message

「from」と「to」は符号付き整数 (ユーザー ID) です。「sent」は、メッセージが送信されたときのタイムスタンプです。'message' はテキスト msg 'read' は int (未読の場合は 0、既読の場合は 1) です。

ユーザーごとにグループ化された最新のメッセージのリストを返そうとしています

例えば

id         from     to      message        sent    read
7324       21      1       try again    1349697192  1
7325       251       1     yo whats up  1349741502  0
7326       251       1     u there      1349741686  0   

クエリの後にこれを返す必要があります

    id      from    to     message      sent        read
7326        251     1        u there    1349741686   0
7324        21      1       try again    1349697192  1

ここに私の質問があります

$q ="SELECT chat.to,chat.read,chat.message,chat.sent,chat.from FROM `chat` WHERE chat.to=$userid GROUP BY chat.from ORDER BY chat.sent DESC,chat.read ASC LIMIT ".(($page-1)*$count).",$count";            

目的の結果が返されません。

4

1 に答える 1

3

sent最新のものを決定するサブクエリを作成してusersから、テーブルと結合する必要がありchatます。

SELECT  a.*                   -- this will list all latest rows from chat table
FROM    `chat` a
        INNER JOIN
        (
            SELECT `from`, `to`, MAX(sent) maxSent
            FROM `chat`
            GROUP BY `from`, `to`
        ) b ON a.`from` = b.`from` AND
                a.`to` = b.`to` AND
                a.sent = b.maxSent
-- WHERE ....                 -- add your condition(s) here

SQLFiddle デモ

于 2012-10-09T01:24:05.370 に答える