我有一个SQL效率问题。这涉及挪威国家彩票。他们画出七个数字和三个奖金球。使用SQL检查彩票中奖彩票
我有一个数据库,所有的图纸和很多门票。问题在于什么是最有效的表格结构和以平局获得所有获奖门票的方式。
这是我的两个主表:
LotteryDraw
DrawId (int, PK)
DrawDate (datetime)
MainNumbers (varchar)
BonusNumbers (varchar)
Main1 (smallint)
Main2 (smallint)
Main3 (smallint)
Main4 (smallint)
Main5 (smallint)
Main6 (smallint)
Main7 (smallint)
Bonus1 (smallint)
Bonus2 (smallint)
Bonus3 (smallint)
我存储每个主和奖金数字既单独以及在有序逗号分隔字符串。
与之相似我有:
LotteryTicket
TicketId (int, PK)
UserId (int, FK)
ValidTill (datetime)
MainNumbers (varchar)
Main1 (smallint)
Main2 (smallint)
Main3 (smallint)
Main4 (smallint)
Main5 (smallint)
Main6 (smallint)
Main7 (smallint)
你得到了4 + 1,5,6,6 + 1和7正确的数字奖品(正确主号码+奖金数)。任何人对于如何编写高效的SQL都有很好的想法,它会返回所有LotteryTicket的抽奖日期的奖品? ValidTill是票证有效的最后一个抽奖日期。
我目前的尝试是在C#中使用Linq2Sql,并且在冰上有一个河马的速度,所以我真的需要一些SQL专业知识。
服务器是Microsoft SQL Server 2008 R2,如果有关系。
更新:在调整了Mark B.的答案后,我结束了以下查询。我需要通过添加一个新表LotteryTicketNumber(ticketid,number)来标准化数据库。
SELECT LotteryTicket.TicketID, count(LotteryTicket.Numbers) AS MainBalls, (
SELECT top 1 ltn.Number
FROM LotteryTicketNumber ltn
WHERE ltn.Number IN (2,4,6)
AND ltn.TicketId = LotteryTicket.TicketId
) As BonusBall
FROM LotteryTicket
LEFT JOIN LotteryTicketNumber ON LotteryTicket.TicketId = LotteryTicketNumber.TicketId
WHERE LotteryTicketNumber.Number IN (13,14,16,23,26,27,30)
GROUP BY LotteryTicket.TicketID
HAVING count(LotteryTicketNumber.Number) >= 4
上述查询返回至少包含4个正确主号码的所有票证。此外,如果同一张票有一个或多个奖励球,则该字段Bonusball!= NULL。这对我来说已经足够了。
感谢您的帮助
一张票上的12个数字不是一张票上的12个数字,而是12个数字范围内的7个数字的组合。你不需要全部储存12 – cairnz 2011-03-28 18:09:11
@ cairnz你是对的。据此编辑。 – Paaland 2011-03-28 18:16:53
@Paaland:你在桌子上定义了哪些索引? – 2011-03-28 18:17:29