有点标题党了,为了吸引更多高人,请各位谅解...有一个任务,要用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过去时就会为成只循环了四个单元格,或是把它推到最后面去了。实在头痛,研究了一天都没招,又要考虑到效率的问题不敢使用多次查询,特再次向各高人求助,看看还有没有更好的解决方法。先谢谢了!
这是一个全国的行业数据库,它每天都会增加一些品种的各地行情,我的任务就是把它最近五天的各地价格打印出来。数据表的格式大概为:(乱编的)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过去时就会为成只循环了四个单元格,或是把它推到最后面去了。实在头痛,研究了一天都没招,又要考虑到效率的问题不敢使用多次查询,特再次向各高人求助,看看还有没有更好的解决方法。先谢谢了!
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中先显示好表头,然后显示数据即可。
是,一个是希望语句可以简洁点,另一个是不知道如何操作你那个语句的结果.在mssql的查询管理器中试了几次都提示错误,所以就放弃了.像日期是不确定的,是获取之数据表里的最近五天,
//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>';
?>
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>';