Нужно найти случайную запись из одной таблицы, затем объединить другую таблицу с этой записью

Справочная информация: в настоящее время я разрабатываю простой онлайн-тест. После того, как пользователь ответил на простой вопрос, он получает возможность повысить свои шансы на выигрыш, выполняя небольшие задачи.

Каждый лот, который зарабатывает пользователь, вставляется в отдельный ряд, поэтому, когда мне нужно найти "случайный" лот, его шансы на выигрыш увеличиваются (пожалуйста, исправьте меня, если я ошибаюсь).

Пример данных из таблицы лотов:

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 есть три лота, и, следовательно, статистически больше шансов на победу по сравнению с другими участниками.

Что мне нужно сделать: когда мне нужно выбрать победителя, я выбираю случайный лот из таблицы лотов. После этого мне нужно найти информацию о победителе.

В настоящее время я использую этот следующий 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. Есть идеи?

2 ответа

Решение

Предполагая, что ваша пользовательская информация находится в таблице с именем Участники с столбцами ParticipantId, FirstName и LastName, вот пример использования 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()

При первом выборе сделайте левое соединение Sample_Lots со своей таблицей участников в столбцах ParticipantId. Затем в вашем первом выборе вы также можете получить информацию об участнике. Результат будет иметь то же количество строк, что и исходный выбор, и будет упорядочен случайным образом.

Другие вопросы по тегам