カーソル/ループ/php側なしでこれを行うためのより良い方法があるかどうか疑問に思っています。私は 5 年以上 DBA をしており、:= ステートメントに出くわしました。とてもかっこいい。
個人 ID と購入したチケット数を含むテーブル (tblPeople)。
PersonId NumTickets
1 3
2 1
3 1
次に、購入したチケットの数に応じて、新しいテーブル (tblTickets) で各人に個別のチケットを割り当てたいと考えています。TicketId はキーの自動インクリメント列です。
TicketId PersonId
100 1
101 1
102 1
103 2
104 3
これがコードです。tblPeople 全体を何度もループして、rowID と呼ばれる新しい計算列をインクリメントします。次に、WHERE 句で購入したチケットの数に基づいて行を除外します。私が見る問題は、サブクエリが巨大であることです。人数が増えるほど、サブクエリが大きくなります。これを書くためのより良い方法があるかどうかはわかりません。
INSERT INTO tblTickets (PersonId)
SELECT PersonId
FROM (
SELECT s.PersonId, s.NumTickets,
@rowID := IF(@lastPersonId = s.PersonId and @lastNumTickets = s.NumTickets, @rowID + 1, 0) AS rowID,
@lastPersonId := s.PersonId,
@lastNumTickets := s.NumTickets
FROM tblPeople m,
(SELECT @rowID := 0, @lastPersonId := 0, @lastNumTickets := 0) t
INNER JOIN tblPeople s
) tbl
WHERE rowID < NumTickets