テーブルから友達のリストを選択しようとしていますが、うまくいきます。ただし、現在、ユーザーのオンライン ステータス/最近のオンライン アクティビティである別のテーブルで結果を並べ替えようとしています。
私が使用しようとしているクエリは次のとおりです(エラーは次のとおりです:「where句」の不明な列「friendID」):
SELECT
CASE WHEN f.userID=$session
THEN f.userID2 ELSE f.userID
END AS friendID
FROM friends f, usersStatus u
WHERE
(
f.userID=$session OR f.userID2=$session
)
AND friendID=u.userID
AND f.state='1'
ORDER BY u.periodicDate DESC, u.setStatus ASC
LIMIT 5
ユーザーの友達を返すだけのクエリは次のとおりです。
SELECT
CASE WHEN f.userID=$session
THEN f.userID2 ELSE f.userID
END AS friendID
FROM friends f
WHERE
(
f.userID=$session OR f.userID2=$session
)
AND f.state='1'
LIMIT 5
friendID
usersStatus.userID と一致する必要があります。次に、上記の例のように並べ替えます。friendID
また、ユーザーステータステーブルにない場合は、それらの行を最後に自動的に並べ替える必要があることも付け加えておきます。
u.periodicDate
はユーザーが設定した最新の日付であるため、これはユーザーが最後にアクティブだったことを示しているため、最近アクティブなユーザーを最初に表示したいと考えています。
u.setStatus
私のスクリプトが彼であると判断したものに応じて設定されるため1
、 、2
、または3
. 1
存在Online
、2
存在Away
、および3
存在Offline
。
上で述べたように、このテーブルにまだ行がないユーザーには、自動的にoffline
ステータスが与えられます。
編集
希望どおりに機能するクエリがありますが、ユーザーを一度だけ返すために GROUP BY friendID を使用する必要があるため、非常に面倒で、リソースを非常に浪費する必要があります。(私の友達データベースはすべての行を保持しているため、人が誰かの友達を外した場合、友達を返した場合などに新しい行が作成されるだけです。)
SELECT * FROM usersStatus,
(SELECT
CASE WHEN friends.userID=$session
THEN friends.userID2 ELSE friends.userID
END AS friendID
FROM friends, usersStatus
WHERE
(
friends.userID=$session OR friends.userID2=$session
)
AND friends.state='1'
) t
WHERE t.friendID=usersStatus.userID
GROUP BY t.friendID
ORDER BY usersStatus.periodicDate ASC, usersStatus.setStatus ASC
LIMIT 5