ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL-根据列值插入多行

2019-10-31 12:15:48  阅读:127  来源: 互联网

标签:loops cursor mysql


我有查询工作,只是想知道是否有更好的方法来执行此操作而没有游标/循环/ 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

标签:loops,cursor,mysql
来源: https://codeday.me/bug/20191031/1975636.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有