0

ユーザーがアドレス指定または送信したすべてのメッセージを選択することになっているmysqlクエリを使用しています。すべてのメッセージを同じ UID でグループ化して、異なるユーザーごとに 1 つのスレッドを表示する必要があります (これは、同じ UID を持つ最後のメッセージを除くすべてのメッセージを削除する必要があることを意味します)。私の問題は、GROUP BY を使用してそれを実行し始めたことですが、実際には残っている行が最新ではなく古いメッセージである場合があります。

これは私が試していたものです:

SELECT `UID`, `Name`, `Text`, `A`.`Date`
FROM `Users`
INNER JOIN (
    (
    SELECT *, To_UID AS UID FROM `Messages` WHERE `From_UID` = '$userID' AND `To_UID` != '$userID'
    )
    UNION ALL
    (
    SELECT *, From_UID AS UID FROM `Messages` WHERE `To_UID` = '$userID' AND `From_UID` != '$userID'
    )
) AS A
ON A.UID = Users.ID
    GROUP BY UID // This doesn't work

UID ごとに最新の日付を含む行のみを表示するにはどうすればよいですか?

4

2 に答える 2

1

use DISTINCTand only useORDER BY date
GROUP BYは、実際にはランダムな行を表示することがありますが、これは必ずしも一般的に議論されているわけではありません。

于 2012-08-18T03:22:57.787 に答える
0

あなたはこのようなことを試すことができます:

select UID, Name, Text, c.date 
from User
inner join (
    select if(b.From_UID = '$userID', b.To_UID, b.From_UID) as UID, 
           * 
           from Messages as b 
           inner join(
               select if(c.From_UID = '$userID', c.To_UID, c.From_UID) as UID, 
                     max(c.date) as date 
                     from Messages as c
                     where c.From_UID = '$userID' or c.To_UID = '$userID' 
                     group by UID
            ) as d on d.date = b.date and d.UID = b.UID
     ) as e on e.UID = Users.id
)

または、一時テーブル/ストアドプロシージャを作成して、作業を楽にします

臨時雇用者表

create temp table t 
    select if(From_UID = '$userID', To_UID, From_UID) as UID, * from Messages


select UID, Name, Text, date
from User
inner join (
    select * 
        from t as t1
        inner join( 
            select 
                t2.UID, 
                max(t2.date) as date
                from t as t2
                group by t2.UID
         ) as t3 on t3.date =  t1.date and t3.UID = t1.UID
    ) as e on e.UID = Users.id     
于 2012-08-18T04:09:13.667 に答える