我有查询工作,只是想知道是否有更好的方法来执行此操作而没有游标/循环/ php端.我已经担任DBA五年了,刚遇到了:=声明.很酷.
表(tblPeople)以及个人ID和他们购买的门票数量.
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
解决方法:
我将添加一个实用程序表Numbers,其中包含从1到一个人可以购买的最大门票数量的所有数字.然后,您可以执行以下操作:
INSERT INTO tblTickets (PersonId)
SELECT s.PersonId
FROM tblPeople s, Numbers n
WHERE n.number <= s.NumTickets