Php 按支腿分组,但也在属于最早收集时间的站点上加入

Php 按支腿分组,但也在属于最早收集时间的站点上加入,php,mysql,Php,Mysql,我需要做以下工作。 我有9条记录被一个日程表id链接。 这9条记录分为3组,共3组,例如第1组第2组和第3组, 所以我有以下几点 order sched leg site date 1 1 1 1 2014-01-01 2 1 2 34 2014-12-31 3 1 1 15 2014-04-23 4 1 3 4 2014-07-12 5 1 2 89

我需要做以下工作。 我有9条记录被一个日程表id链接。 这9条记录分为3组,共3组,例如第1组第2组和第3组, 所以我有以下几点

order sched leg site   date
1      1     1   1     2014-01-01
2      1     2   34    2014-12-31
3      1     1   15    2014-04-23
4      1     3   4     2014-07-12
5      1     2   89    2014-04-10
6      1     1   13    2014-09-09
7      1     3   9     2014-03-12
8      1     3   10    2014-11-10
9      1     2   11    2014-08-08
在我的sql中,我按腿分组,因此我得到了3条记录。 我需要提取每个分支组中最早和最晚日期的站点ID,然后将我的站点信息表加入到生成的ID中,以提取这些站点的CompanyNames等

我的腿部sql代码如下

select l.leg_no, 
                  l.start_region, 
                  r.region_name as end_region, 
                  l.rate,
                  sum(x.est_distance) as distance,
                  sum(x.est_weight) as weight,
                  count(x.order_id) as count, 
                  min(x.req_col_time) as earliesttime,
                  sum(x.total_rpb) as total_rpb, 
                  max(x.req_del_time) as latesttime from 
                  (select ord2.* from loads as l1
                  left join orders as ord2 on ord2.load_id = l1.load_id
                  left join debrief_docs as db2 on db2.oid = ord2.order_id
                  where l1.schedule_id = '.$id.'
                  union
                  select ord3.* from loads as l2
                  left join drops as drop1 on drop1.load_id = l2.load_id
                  left join orders as ord3 on ord3.drop_id = drop1.drop_id
                  left join debrief_docs as db3 on db3.oid = ord3.order_id
                  where l2.schedule_id = '.$id.')as x
                  join loads as l on l.schedule_id = '.$id.'
                  join regions as r on r.region_id = l.region_id
                  group by l.leg_no asc
任何关于如何实现这一目标的想法都将不胜感激
谢谢大家

让我们进入问题的重要部分,即获取每个分支组的第一个和最后一个站点ID。为此,我将使用变量。以下查询枚举了分支ID:

  select l.*,
         (@rn := if(@l = leg_id, @rn + 1,
                    if(@l := leg_id, 1, 1)
                   )
         ) as seqnum
  from loads l cross join
       (select @rn := 0, @l := 0) vars
  order by schedule_id, leg_id, date;
以下内容总结了记录并生成两列,第一列和最后一列:

select schedule_id, leg_id,
       max(case when seqnum = 1 then site_id end) as first_site,
       max(case when seqnum = 3 then site_id end) as last_site
from (select l.*,
             (@rn := if(@l = leg_id, @rn + 1,
                        if(@l := leg_id, 1, 1)
                       )
             ) as seqnum
      from loads l cross join
           (select @rn := 0, @l := 0) vars
      order by schedule_id, leg_id, date
     ) l
group by schedule_id, leg_id;

然后,您可以加入其余的表,以获得所需的其他信息。

WOW。我得承认我不知道你刚才描述了什么。我向你们致敬,感谢你们在这个层次上理解mysql。我能请你帮我把它分解一下吗?@TerenceBruwer。我想是的。运行第一个查询,注意seqnum列does(它枚举具有相同
schedule\u id
leg\u id
的行)。然后运行第二个查询,看看它能做什么(它会根据您的逻辑获取第一个和最后一个站点ID)。然后我将感谢您的回答,并承认我的mysql知识水平没有达到我能够理解您的代码的水平。