Если вы хотите нормализовать данные, разбив список чисел на подстатью, вы можете тривиально определить победителей, например:
SELECT LotteryTicket.TicketID, GROUP_CONCAT(LotteryTicketNumbers.number), COUNT(LotteryTicketNumbers.number) AS cnt
FROM LotteryTicket
LEFT JOIN LotterYTicketNumbers ON (LotteryTicketNumbers.number IN (winning, numbers, here))
GROUP BY LotteryTicket.TicketID
HAVING cnt >= 3;
, где «3» представляет минимальное количество совпавших чисел, необходимых для выигрыша любого приза. Это не будет обрабатывать «бонусные» номера, если таковые имеются, хотя вы можете повторить тот же запрос и пометить любые розыгрыши, где бонусный номер присутствует, с производным полем.
Обратите внимание, что это не проверено, просто идет вверх головой, поэтому, вероятно, есть некоторые синтаксические ошибки.
комментарий:
GROUP_CONCAT - это специфичное для mysql расширение sql. Вы можете разорвать это, так как может показаться, что вы используете SQLserver.
«LottoTicketNumbers» - это то, что вы использовали бы для нормализации ваших таблиц. Вместо одной монолитной записи «билета» вы разбиваете ее на две таблицы:
LottoTicket: ticketID, drawDate
LottoTicketNumbers: ticketID, drawNumber
Допустим, у вас есть билет на розыгрыш 1/2011 апреля с номерами 1,12,23,44,55, в результате вы получите что-то вроде:
LottoTicket: ticketID = 1, drawDate = Apr 1/2011
LottoTicketNumbers: (1,1), (1,12), (1,23), (1,44), (1,55)
Структурирование таблиц таким образом заставляет запрос работать, используя некоторую базовую теорию множеств и мощь реляционной базы данных. Исходная структура таблицы делает почти невозможным проведение сравнений, необходимых для определения всех возможных комбинаций выигрышных чисел, в результате вы получите некую отвратительную конструкцию, такую как
select ...
where (number1 in (winning, numbers here), number2 in (winning, numbers, here), number3 in (winning, numbers,here), etc....
и не сообщит вам, какой именно приз вы выиграли (соответствует 3, 5 + бонус и т. Д.).
Пример результатов запроса:
Допустим, номера ничьих 10,20,30,40,50, а у вас есть билет с 10,20,30,42,53. Вы выбрали 3 из 5 номеров розыгрыша и выиграли 10 долларов. Используя приведенную выше структуру нормализованных таблиц, вы получите такие таблицы:
LottoTicket: id #203, drawDate: Apr 1/2011
LottoTicketNumbers: (203, 10), (203, 20), (203, 30), (203, 42), (203, 53)
И запрос будет
SELECT LottoTicket.TicketID, COUNT(LottoTicketNumbers.number) AS cnt
FROM LottoTicket
LEFT JOIN LottoTicketNumbers ON (LottoTicketNumbers.number IN (10,20,30,40,50))
GROUP BY LottoTicket.TicketID
HAVING CNT >= 3
Вы получите (не сгруппированные) результаты
203, 10
203, 20
203, 30
и с функциями группировки / агрегирования:
203, 3 // ticket #203 matched 3 numbers.