在阅读了一些规范化之后,似乎我不太了解这个概念。

我正在尝试做的是创建一个表,其中包含有关项目抽奖活动的信息。

因此,该项目的信息是ItemName和Defindex。

之后,我需要有抽奖活动的“门票”,以及去过的用户。我想限制售票数量。

因此,TicketA,TicketB,TicketC,TicketD。

是否存在一个查询,我可以使用该查询将球员姓名(如果未满)插入到TicketA中,或者如果TicketB如果已满,则将其插入其中,依此类推,直到售出所有门票为止?

最佳答案

以下是帮助您入门的示例:SQL Fiddle

设置基本表格以跟踪抽奖和彩票。

CREATE TABLE Raffle
(
     Id BIGINT AUTO_INCREMENT NOT NULL PRIMARY KEY
    ,Name VARCHAR(50) NOT NULL
    ,WinnerLimit INT NOT NULL
);

CREATE TABLE RaffleTicket
(
     Id BIGINT AUTO_INCREMENT NOT NULL PRIMARY KEY
    ,RaffleId BIGINT NOT NULL
    ,UserId BIGINT NOT NULL
);


设置一个视图以确定抽奖是否还剩票证。

CREATE VIEW RaffleStatus
AS
    SELECT Id AS RaffleId,
           CASE WHEN EXISTS
           (
                SELECT 1
                FROM RaffleTicket rt
                WHERE rt.RaffleId = r.Id
                GROUP BY rt.RaffleId
                HAVING COUNT(rt.RaffleId) = r.WinnerLimit
           )
           THEN 1
           ELSE 0
           END AS SoldOut
    FROM Raffle r;


创建一个过程以防止门票超售。请注意,这对于多线程使用可能并不安全。

DELIMITER //
CREATE PROCEDURE InsertRaffleTicket (IN userId BIGINT, IN raffleId BIGINT)
BEGIN
    INSERT INTO RaffleTicket(UserId, RaffleId)
    SELECT userId, raffleId
    FROM RaffleStatus rs
    WHERE rs.RaffleId = raffleId
    AND rs.SoldOut = 0;
END//
DELIMITER ;

10-07 14:01