我有一个Windows窗体(c#)应用程序和一个SQL Server中的表,它有两列,如下所示:
ticket (int) | numbers (string)
12345 | '01, 02, 04, 05, 09, 10, 23'
此表可能有100.000行或更多。
我需要做的就是找到一系列数字,如彩票。 我有12次点击,11次点击和9次点击,对于每个抽奖号码,我必须搜索12次点击,11次点击或9次点击。
那么,采用这种方法的最佳方法是什么?我需要最好的表现。
现在我有了这段代码:
string sentSQL = " SELECT ticket, numbers FROM tableA";
/* CODE TO PERFORM THE CONNECTION */
/*...*/
DbDataReader reader = connection.ExecuteReader();
int hits12, hits11, hits9 = 0;
int count;
while (reader.Read())
{
count = 0;
string numbers = reader["numbers"].ToString();
string ticketNumber = reader["ticket"].ToString();
int maxJ = balls.Count; //balls is the ArrayList with the numbers currently extracted in the raffle
for (int j = 0; j < maxJ; j++)
{
if (numbers.Contains(balls[j].ToString()))
{
count++;
}
}
switch (count)
{
case 12:
hits12++;
break;
case 11:
hits11++;
break;
case 9:
hits9++;
break;
}
}
这很有效,但也许有更好的方法可以实现。
我正在使用SQL Server 2012,也许有一个功能可以帮助我吗?
编辑:我可以在sql查询中执行每个数字SUM
的{{1}}来获取sql查询中的点击量吗?
答案 0 :(得分:0)
你目前有一个非常俗气的解决方案。
create table ticket (
ticketId int not null -- PK
)
create table TicketNumbers *
ticketId int not null,
numberSelected int not null
)
TicketNumbers有一个FK到Ticket,一个PK为TicketNumber + numberSelected。
select t.ticketId, count(*) CorrectNumbers
from ticket t
inner join TicketNumbers tn on tn.ticketId = t.TicketId
where tn.numberSelected in (9, 11, 12, 15) -- list all winning numbers
group by t.ticketId
order by count(*) desc
干杯 -
答案 1 :(得分:-1)
改善这种情况的一种简单方法是更新您的select语句,以便只获取数字大于第一个球数的记录,而不是最后一个球数+ 1 ...
示例(可能不正确的SQL):
SELECT ticket, numbers FROM tableA where '10' < numbers and '43' > numbers