有点标题党了,为了吸引更多高人,请各位谅解...有一个任务,要用PHP去查询一个MSSQL库,实现如下图一样的表格,请各位指教。
这是一个全国的行业数据库,它每天都会增加一些品种的各地行情,我的任务就是把它最近五天的各地价格打印出来。数据表的格式大概为:(乱编的)ProID  PName     PDate         Price      Location
13    高镁钢    2009-06-27    1540.000    哈尔滨
13    高镁钢    2009-06-26    1540.000    哈尔滨
13    高镁钢    2009-06-25    1540.000    哈尔滨
13    高镁钢    2009-06-24    1540.000    哈尔滨
13    高镁钢    2009-06-23    1540.000    哈尔滨
13    高镁钢    2009-06-27    1520.000    长春
13    高镁钢    2009-06-26    1520.000    长春
13    高镁钢    2009-06-24    1520.000    长春
13    高镁钢    2009-06-23    1520.000    长春
13    高镁钢    2009-06-27    1660.000    大连
13    高镁钢    2009-06-26    1660.000    大连
13    高镁钢    2009-06-25    1660.000    大连
13    高镁钢    2009-06-23    1650.000    大连
13    高镁钢    2009-06-27    1660.000    锦州
13    高镁钢    2009-06-26    1660.000    锦州
13    高镁钢    2009-06-25    1660.000    锦州
13    高镁钢    2009-06-24    1650.000    锦州
13    高镁钢    2009-06-23    1650.000    锦州
我现在用的是:<?php 
$result = $pdo->getAll("SELECT * FROM Prodata WHERE ProID=13 AND DateDiff(day,PDate,getdate())between 0 AND 5 ORDER BY Location,PDate ASC");
foreach ($result as $row){
    extract($row);
    $arrData[$Location][$PDate] = $row['Price'];
}
?>
然后再分别的foreach出地名,在地名的循环里再foreach价格。表面看起来是OK了,但后来我在使用测试时发现还是有问题,这种方法虽然高效(仅查一次数据)但存在着一些问题,下面我说明一下。
---------------------------------------------------------------------------------
这个问题我前几天已问过,也得了好几个达人的建议,最后用了jakey9826的索引数组的方法。并用了三个foreach,终于勉强达到要求。
上个帖:http://topic.csdn.net/u/20090703/10/d0976e82-d055-4bf1-8281-bc039cdab2a5.html?seed=1881623939但后来发现还是有问题,请各位细看图表,它的五天数据内并非每天都有,有时候一个地方会只有三天或四天,用foreach的时候会变成价格的单元格与日期单元格不匹配的问题。如图表中的长春,它6.25日是没数据的,但我用数组foreach过去时就会为成只循环了四个单元格,或是把它推到最后面去了。实在头痛,研究了一天都没招,又要考虑到效率的问题不敢使用多次查询,特再次向各高人求助,看看还有没有更好的解决方法。先谢谢了!

解决方案 »

  1.   

    上次不是建议你直接用SQL语句来实现?通过程序生成
    select Location, 
    max(case PDate when '2009-06-24' then Price else 0 end) as D1,
    max(case PDate when '2009-06-25' then Price else 0 end) as D2,
    max(case PDate when '2009-06-26' then Price else 0 end) as D3,
    max(case PDate when '2009-06-27' then Price else 0 end) as D4,
    max(case PDate when '2009-06-28' then Price else 0 end) as D5
    from yourtable
    where ProID=13
    and PDate>='2009-06-24'
    group by Location然后在PHP中先显示好表头,然后显示数据即可。
      

  2.   


    是,一个是希望语句可以简洁点,另一个是不知道如何操作你那个语句的结果.在mssql的查询管理器中试了几次都提示错误,所以就放弃了.像日期是不确定的,是获取之数据表里的最近五天,
      

  3.   

    <?php
    //init.
    $numOfDays = 5;
    $firstDate = '2009-06-23';
    $lastDate = date('Y-m-d', strtotime("$firstDate +".($numOfDays-1)." days"));//collect data
    $locations = $dates = array();
    if (false !== ($rs = $pdo->getAll("SELECT * FROM Prodata WHERE ProID=13 AND (PDate BETWEEN '$firstDate' AND '$lastDate')"))) {
    foreach ($rs as $row){
    $locations[$row['Location']] = true;
    $dates[$row['PDate']] = true;
        $data[$row['Location']][$row['PDate']] = $row['Price'];
    }
    ksort($locations);
    ksort($dates);
    } else {
    die('No records');
    }//print table
    echo '<table>';
    foreach ($locations as $loc) {
    echo '<tr>';
    foreach ($dates as $day) {
    echo '<td>',(isset($data[$loc][$day]) ? $data[$loc][$day] : '-'),'</td>';
    }
    echo '</tr>';
    }
    echo '</table>';
    ?>
      

  4.   

    //print table
    echo '<table>';
    foreach (array_keys($locations) as $loc) {
    echo '<tr>';
    foreach (array_keys($dates) as $day) {
    echo '<td>',(isset($data[$loc][$day]) ? $data[$loc][$day] : '-'),'</td>';
    }
    echo '</tr>';
    }
    echo '</table>';
      

  5.   

    谢谢yctin,太强了,数组都给你玩得出神入化了!我太笨了,给这个索引数组弄得晕头转向的,还在想要怎么样进行数组不足补位呢。