1

テーブルから友達のリストを選択しようとしていますが、うまくいきます。ただし、現在、ユーザーのオンライン ステータス/最近のオンライン アクティビティである別のテーブルで結果を並べ替えようとしています。

私が使用しようとしているクエリは次のとおりです(エラーは次のとおりです:「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

friendIDusersStatus.userID と一致する必要があります。次に、上記の例のように並べ替えます。friendIDまた、ユーザーステータステーブルにない場合は、それらの行を最後に自動的に並べ替える必要があることも付け加えておきます。

u.periodicDateはユーザーが設定した最新の日付であるため、これはユーザーが最後にアクティブだったことを示しているため、最近アクティブなユーザーを最初に表示したいと考えています。 u.setStatus私のスクリプトが彼であると判断したものに応じて設定されるため1、 、2、または3. 1存在Online2存在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
4

1 に答える 1

0

書く代わりに

AND friendID=u.userID

エイリアスの実際の値を使用します。

AND CASE WHEN f.userID=$session 
    THEN f.userID2 ELSE f.userID 
    END = u.userID
于 2012-12-18T03:34:42.557 に答える