Нужно найти случайную запись из одной таблицы, затем объединить другую таблицу с этой записью
Справочная информация: в настоящее время я разрабатываю простой онлайн-тест. После того, как пользователь ответил на простой вопрос, он получает возможность повысить свои шансы на выигрыш, выполняя небольшие задачи.
Каждый лот, который зарабатывает пользователь, вставляется в отдельный ряд, поэтому, когда мне нужно найти "случайный" лот, его шансы на выигрыш увеличиваются (пожалуйста, исправьте меня, если я ошибаюсь).
Пример данных из таблицы лотов:
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. Затем в вашем первом выборе вы также можете получить информацию об участнике. Результат будет иметь то же количество строк, что и исходный выбор, и будет упорядочен случайным образом.