SQL 효율성 질문이 있습니다. 이것은 노르웨이 추첨에 관한 것입니다. 그들은 7 개의 숫자와 3 개의 보너스 공을 그립니다.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)
나는 main-와 보너스 숫자의 각 모두 개별적으로뿐만 아니라 정렬 된 순서로 쉼표로 구분 된 문자열을 저장합니다. 내가있어
Similary는 :
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을 작성하는 방법에 대한 훌륭한 아이디어가 있습니다. 추첨 날에 대한 모든 LotteryTickets를 반환 할 것입니다. 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 필드도 입력하십시오. 이것은 나를 위해 충분하다.
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;
: 당신이 하위 테이블에 번호 목록을 분할하여 데이터를 정상화 할 의향이 있다면, 당신은 하찮게 같은으로 우승자를 결정할 수
12 티켓의 번호는 한 티켓에 12 개의 숫자가 아니며 12 개의 숫자 범위에 7 개의 숫자가 조합 된 것입니다. 모두를 저장할 필요가 없습니다. – cairnz
@cairnz 맞습니다. 그에 따라 편집 됨. – Paaland
@Paaland : 테이블에 어떤 인덱스를 정의 했습니까? –