我碰到这一点,它得到所有教学班,(在此示例中)到3先决条件,但可以扩展到4,5,6:试试这个“IDSeq =?”。
这里的关键要素是根据公用部门+班级号码每次在组变化开始时从1开始获取分配给每条记录的号码。为此,我将SQL变量应用于FIRST确保每个组的排序顺序为1,2,3 ... 1,2,... 1,... 1,2,3,4,5。 。等等
内部查询的结果
一旦做到这一点,我们可以通过没有其他复杂的加盟,加盟,unioning等做了简单的组...只要申请基于已知序列的IF()的max()。正如你所看到的模式,我得到了它的先决条件Dept和ClassNum所提供的那个是“1”st记录,然后再次在“2”和“3”rd,但可以应用通过使用max(if()),每个类将总是有1个序列,但只有有时会有2个,更不用说3个了, 4或5.所以,如果没有值,它至少会被空格填充,所以它不会显示为空。然后,如果/当存在一个值时,MAX()将在它碰撞时取代空格。
最终的查询是惊人的,可能只是你需要的。
select
NewSet.Dept,
NewSet.ClassNum,
max(if(NewSet.IDSeq = 1, NewSet.PreReqDept, ' ')) FirstDept,
max(if(NewSet.IDSeq = 1, NewSet.PreReqClassNum, ' ')) FirstClassNum,
max(if(NewSet.IDSeq = 2, NewSet.PreReqDept, ' ')) SecondDept,
max(if(NewSet.IDSeq = 2, NewSet.PreReqClassNum, ' ')) SecondClassNum,
max(if(NewSet.IDSeq = 3, NewSet.PreReqDept, ' ')) ThirdDept,
max(if(NewSet.IDSeq = 3, NewSet.PreReqClassNum, ' ')) ThirdClassNum
from
(select
@orig := @orig +1 as OrigSeq,
@seq := if(concat(P.Dept, P.ClassNum) = @LastGrp, @seq +1, 1) as IDSeq,
@LastGrp := concat(P.Dept, P.ClassNum) NextGrp,
P.Dept,
P.ClassNum,
P.PreReqDept,
P.PreReqClassNum
from
PreReqs P,
(select @orig := 0, @seq := 0, @LastGrp := '') x
order by
Dept,
ClassNum) NewSet
group by
NewSet.Dept,
NewSet.ClassNum
order by
NewSet.Dept,
NewSet.ClassNum
只是好奇......我们在这里谈了多少行?如果没有太多数据,则可以更容易地选择1个查询中的所有可能适用的行,并根据需要处理结果集以获取所需的结果结构。 – scunliffe
@scunliffe你的意思是创建一个简单的查询来检索所有的表,然后使用服务器代码来创建我的结果? 我必须在一个查询中做到这一切 – Eric