2013-05-15 57 views
1

我有一个结果集,需要在屏幕上显示,但问题是显示使用echo命令的结果集的每一行时,顺序会发生变化。任何人都可以这样说为什么发生这种情况,并为我提供了一种方法来克服它。这里是我的实际和打印输出。在php中改变结果集顺序

实际结果集:

JAIKE-ILENE-WACKI-MAZIE-REGLE-SBJ-KMMU 
LVZ-HARTY-MUGZY-STW 
MAZIE-SIXIE-SBJ-KMMU 
PXT-LOUIE-GATBY-RAZER-BUZIE-JAIKE-ILENE-WACKI-MAZIE 
SWANN-GATBY-RAZER-BUZIE-JAIKE-ILENE-WACKI-MAZIE 

输出:

JAIKE-SBJ-ILENE-KMMU-WACKI-MAZIE-REGLE 
MUGZY-STW-LVZ-HARTY 
SBJ-KMMU-MAZIE-SIXIE 
ILENE-GATBY-WACKI-RAZER-MAZIE-BUZIE-PXT-JAIKE-LOUIE 
WACKI-RAZER-MAZIE-BUZIE-JAIKE-SWANN-ILENE-GATBY 

这里是我的代码

$sql3="SELECT GROUP_CONCAT(l.fix_ident SEPARATOR '-') AS fix_seq,l.airport_ident,x.star_ident,x.transition_ident, 
       x.fix_ident from corept.std_star_leg l 
       JOIN 
        (SELECT DISTINCT c.airport_ident,c.star_ident,c.transition_ident,c.fix_ident 
        FROM corept.std_star_leg c 
        INNER JOIN 
          (SELECT star_ident,transition_ident,max(sequence_num) seq,route_type 
          FROM corept.std_star_leg 
          WHERE data_supplier='J' 
          AND airport_ident='KMMU' 
          GROUP BY star_ident, 
          transition_ident)b ON c.sequence_num=b.seq 
          AND c.star_ident=b.star_ident AND c.transition_ident=b.transition_ident 
          LEFT JOIN 
           (SELECT name,trans 
           FROM skyplan_deploy.deploy_stars 
           WHERE apt='KMMU' 
           AND name!=trans) d 
           ON d.name=c.star_ident 
           AND d.trans=c.fix_ident 
           WHERE c.data_supplier='J' 
           AND c.airport_ident='KMMU' AND d.name is null)x 
           where l.airport_ident='KMMU' and l.transition_ident=x.transition_ident 
           and l.star_ident=x.star_ident and l.data_supplier='J' 
           group by x.star_ident,x.transition_ident 
           order by l.star_ident,x.transition_ident,l.sequence_num"; 
    $res3=mysqli_query($mysqli,$sql3); 
if($res3) 
    { 
    while($newArray3=mysqli_fetch_array($res3,MYSQLI_ASSOC)) 
    { 
    $apt=$newArray3['airport_ident']; 
    $star_ident=$newArray3['star_ident']; 
    $trans_ident=$newArray3['transition_ident']; 
    $fix_ident=$newArray3['fix_ident']; 
    $fix_seq=$newArray3['fix_seq']; 
    echo $apt.",".$star_ident.",".$trans_ident.",".$fix_ident.",COREPT,".$fix_seq; 
    echo "<br>"; 
    } 
    } 
else 
{ 
    printf("ERROR:%s\n",mysqli_error($mysqli)); 
} 
+1

向我们显示代码。 – Kasyx

+0

你是问我显示整个脚本还是查询? – user2341693

+1

您如何知道“实际结果集”的顺序? – eggyal

回答

0

您的查询似乎过于复杂。它似乎是由sequence_num找到GroupWise的最大std_star_leg记录(上start_identtransition_ident分组),不包括对其中已经有一个匹配的非自参照deploy_star,然后用串连所有匹配fix_ident值再次返回分组结果成一个字符串?

如果是这样,下面大大简化查询应该实现相同的效果:

SELECT GROUP_CONCAT(fix_ident SEPARATOR '-') AS fix_seq, 
     airport_ident, 
     star_ident, 
     transition_ident 
FROM  corept.std_star_leg l NATURAL JOIN (
      SELECT star_ident, transition_ident, 
        data_supplier, airport_ident, 
        MAX(sequence_num) sequence_num 
      FROM  corept.std_star_leg 
      WHERE data_supplier = 'J' 
       AND airport_ident = 'KMMU' 
      GROUP BY star_ident, transition_ident 
     ) b 
WHERE NOT EXISTS (
      SELECT NULL 
      FROM skyplan_deploy.deploy_stars d 
      WHERE d.name != d.trans 
       AND d.name = l.star_ident 
       AND d.trans = l.fix_ident 
       AND d.apt = l.airport_ident 
     ) 
GROUP BY star_ident, transition_ident 

注意的是,尽管您以前在最外层的选择列表中选择x.fix_ident,我省略了这样的列,因为它的价值将由服务器从fix_seq中的那些中不确定地选择。现在

,为您的问题(这出现可能与其中fix_ident值出现在GROUP_CONCAT()字符串中的顺序fix_seq —虽然它的可怕很难理解,从你的问题),也许你想使用ORDER BY参数为GROUP_CONCAT()函数?例如:

SELECT GROUP_CONCAT(fix_ident SEPARATOR '-' ORDER BY ...) AS fix_seq 

但是,我不清楚什么命令你需要(在原始查询的唯一ORDER BY条款完全是多余的)。