1

背景:現在、簡単なオンライン クイズを開発しています。ユーザーが簡単な質問に答えた後、ユーザーは小さなタスクを実行して勝つ可能性を高める機会を得ます。

ユーザーが獲得したすべてのロットは別の行に挿入されるため、「ランダムな」ロットを見つける必要がある場合、勝つ可能性が高くなります (間違っている場合は修正してください)。

ロット テーブルのサンプル データ:

LotId      ParticipantId      Created
1          1                  2012-11-16 12:00:00
2          2                  2012-11-16 12:02:00    
3          2                  2012-11-16 12:06:00 
4          2                  2012-11-16 12:15:00    
5          3                  2012-11-16 12:16:00

これは、ParticipantId 2 の参加者が 3 つのロットを持っていることを意味し、したがって、他の参加者と比較して統計的に勝つ可能性が高くなります。

私がしなければならないこと:勝者を引く必要があるときは、くじの表からランダムにくじを選びます。この後、勝者に関する情報を見つける必要があります。

現在、次の SELECT を使用しています (SELECT の改善に関するコメントを歓迎します)。その後、コードの後半で、ユーザーの情報を含む別の SELECT を使用しています。

SELECT TOP 1 LotId, ParticipantId FROM Sample_Lots WITH (NOLOCK)
WHERE
    CAST(Created AS DATE) = '2012-11-16'
    AND
    ParticipantId NOT IN
    (
        SELECT ParticipantId FROM Sample_Winners WITH (NOLOCK)
        WHERE
            ParticipantId IS NOT NULL
            AND
            CAST(ThisDate AS DATE) = '2012-11-16'
    )
    AND
    ParticipantId IN
    (
        SELECT ParticipantId FROM Sample_Participants WITH (NOLOCK)
        WHERE
            ParticipationConfirmed IS NOT NULL
    )
ORDER BY NEWID()

私はこれについて頭を働かせることができません。ランダムなロットが必要で、このランダムなロットから同じ SELECT でユーザーの情報を取得する必要があります。何か案は?

4

2 に答える 2

0

最初の選択で、Sample_Lots を ParticipantId 列の Participant テーブルに左結合します。次に、最初の選択で、参加者に関する詳細を取得することもできます。結果は、元の選択と同じ行数になり、ランダムに並べられます。

于 2012-11-16T15:38:20.870 に答える
0

ユーザー情報が、列 ParticipantId、FirstName、および LastName を持つ、Participant という名前のテーブルにあると仮定すると、そのテーブルへの JOIN を使用した例を次に示します。

SELECT TOP 1 sl.LotId, sl.ParticipantId, p.FirstName, p.LastName 
FROM Sample_Lots sl 
INNER JOIN Participants p ON sl.ParticipantId = p.ParticipantId WITH (NOLOCK)
WHERE
    CAST(Created AS DATE) = '2012-11-16'
    AND
    sl.ParticipantId NOT IN
    (
        SELECT ParticipantId FROM Sample_Winners WITH (NOLOCK)
        WHERE
            ParticipantId IS NOT NULL
            AND
            CAST(ThisDate AS DATE) = '2012-11-16'
    )
    AND
    sl.ParticipantId IN
    (
        SELECT ParticipantId FROM Sample_Participants WITH (NOLOCK)
        WHERE
            ParticipationConfirmed IS NOT NULL
    )
ORDER BY NEWID()
于 2012-11-16T15:34:00.780 に答える