我有查询工作,只是想知道是否有更好的方法可以在没有游标/循环/php 端的情况下执行此操作。我做 DBA 已经 5 年多了,刚刚遇到 := 语句。很酷。
包含人员 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