0

2 つのテーブルがあり、そのうちの 1 つである「リクエスト」には、フレンド リクエストを送信したユーザー、またはフレンド リクエストを受信したユーザーがいます。2 番目のテーブルには、最終候補に挙げられたユーザーの記録を自分用に保持します。ここで、これらすべてのユーザーを一緒に選択したいと思います (私が要求したユーザー、私を要求したユーザー、最終候補に挙げたユーザー)。これにはユニオンクエリを使用しており、列の型に基づいてそれらを区別しています

select Distinct userid,type,status from
(
select RequestSenderId as UserId,'requestedme' as type,'1' as status from tblrequest where RequestReceiverId=@UserId 

union
select RequestReceiverId as UserId,'requestedbyme' as type,'2' as status from tblrequest where RequestSenderId=@UserId 

union
select Shortlisteduserid as UserId,'Shortlisted' as type,'0' as status from tblshortlist where userid=@UserId
)

問題は、私が最終候補に挙げた場合、個別のユーザー ID を取得できず、彼も私に要求を送信したことです。

結果から個別のユーザーIDを取得する方法を誰かが提案できますか。最優先事項は、最終候補としてではなく、要求どおりにユーザー ID を取得することです。

4

3 に答える 3

0

これはあなたを助けることができます。

select userid,type,status from
(
select Distint  RequestSenderId ,'requestedme' as type,'1' as status from tblrequest where ReceiverId=@UserId 

union ALL
select Distint  RequestReceiverId ,'requestedbyme' as type,'2' as status from tblrequest where SenderId=@UserId 

union ALL
select Distint  Shortlisteduserid ,'Shortlisted' as type,'0' as status from tblshortlist where userid=@UserId
)
于 2012-05-07T06:39:42.120 に答える
0

ランキング関数 (ROW_NUMBER または DENSE_RANK) を使用して、結果に優先順位を付けることができます。

SELECT UserId, Type, Status
FROM (
    SELECT UserId, Type, Status
    , Priority = ROW_NUMBER() OVER (PARTITION BY UserID ORDER BY Type DESC)
    FROM (
        SELECT ReceiverId, RequestSenderId, 'requestedme', 1 FROM tblRequest
        UNION ALL
        SELECT SenderId, RequestReceiverId, 'requestedbyme', 2 FROM tblRequest
        UNION ALL
        SELECT UserId, Shortlisteduserid ,'Shortlisted', 0 FROM tblShortlist
    ) U (FilterUserId, UserId, Type, Status)
    WHERE FilterUserId = @UserId
) R
WHERE Priority = 1
于 2012-05-07T09:34:23.827 に答える
0

以下はどうですか?それはおそらく最も効率的な解決策ではありません..

WITH requestedMe (userid, type, status)
    AS (
        SELECT RequestSenderId AS UserId,'requestedme' AS type,'1' AS status 
        FROM tblrequest 
        WHERE ReceiverId=@UserId)
    requestedByMe (userid, type, status)
    AS (
        SELECT RequestReceiverId AS UserId,'requestedbyme' AS type,'2' AS status 
        FROM tblrequest 
        WHERE SenderId=@UserId
            AND NOT EXISTS (
                SELECT *
                FROM requestedMe
                WHERE requestedMe.userid = tblrequest.RequestReceiverId))
    shortListed (userid, type, status)
    AS (
        SELECT Shortlisteduserid AS UserId,'Shortlisted' AS type,'0' AS status 
        FROM tblshortlist 
        WHERE userid=@UserId
            AND NOT EXISTS (
                SELECT *
                FROM requestedMe
                WHERE requestedMe.userid = tblshortlist.Shortlisteduserid)
            AND NOT EXISTS (
                SELECT *
                FROM requestedByMe
                WHERE requestedByMe.userid = tblshortlist.Shortlisteduserid))
SELECT userid, type, status
FROM requestedMe
UNION
SELECT userid, type, status
FROM requestedByMe
UNION
SELECT userid, type, status
FROM shortListed
于 2012-05-07T06:49:54.450 に答える