[英]fetch data form mysql table
你好,下面是我的查詢,它給出了很好的結果
SELECT `collection_series`.`chart_name`, `datadatexnumericy`.`x` as date, `datadatexnumericy`.`y`
FROM (`datadatexnumericy`)
JOIN `collection_series` ON `collection_series`.`series_id` = `datadatexnumericy`.`series_id`
WHERE `collection_series`.`collection_id` = '265'
chart_name date y
Sydney 1973-09-30 2.50000
Melbourne 1973-09-30 5.70000
Brisbane 1973-09-30 6.60000
Perth 1973-09-30 7.10000
但是,如果我想得到如下所示的結果,有什么解決方案可以幫助您嗎?
date Sydney Melbourne Brisbane Perth
1973-09-30 2.50000 5.70000 6.60000 7.10000
下面是我的表結構
datadatexnumericy(first table)
series_id x y
43532 1991-12-31 -2.10000
不要對series_id感到困惑,因為城市名稱來自收集系列表,其中series_id與之匹配並獲取城市名稱
collection_series(second table)
in this table there is coloumn which name is collection_id and series_id
collection id is '265' and i am matching `collection_series`.`series_id` = `datadatexnumericy`.`series_id`
我現在無法想到以這種方式查詢它的方法,但是您可以首先重組正常的獲取結果。 首先以該專用格式構建它,然后呈現它。
首先是獲取標題(日期和地點等),然后您需要根據日期對正文數據進行分組,並將其推入另一個容器中。
粗略的例子:
<?php
// temporary container
$temp = array();
while($row = whatever_fetch_function_assoc($result)) {
$temp[] = $row; // push the rows
}
// restructure
$places = array_column($temp, 'chart_name'); // if this is not available (only PHP 5.5)
// foreach($temp as $v) {
// $places[] = $v['chart_name']; // if its not available just use foreach
// }
// header creation
$headers = array_merge(array('Date'), $places); // for headers
foreach($temp as $v) { // then extract the dates
$data[$v['date']][] = $v['y']; // group according to date
}
?>
然后,一旦構造好結構,然后就可以按循環顯示(通常)了:
<!-- presentation -->
<table cellpadding="10">
<thead>
<tr><?php foreach($headers as $h): // headers ?>
<th><?php echo $h; ?></th>
<?php endforeach; ?></tr>
</thead>
<tbody>
<?php foreach($data as $date => $values): ?>
<tr>
<td><?php echo $date; // the date ?></td>
<?php foreach($values as $d): ?>
<td><?php echo $d; ?></td>
<?php endforeach; ?>
</tr>
<?php endforeach; ?>
</tbody>
</table>
如果它是一組已知的chart_names
,則可以使用以下技術來生成數據透視表
select
dd.x as date,
max( case when cs.chart_name = 'Sydney' then dd.y end ) as `Sydney`,
max( case when cs.chart_name = 'Melbourne' then dd.y end ) as `Melbourne`,
max( case when cs.chart_name = 'Brisbane' then dd.y end ) as `Brisbane`,
max( case when cs.chart_name = 'Perth' then dd.y end ) as `Perth`
from datadatexnumericy dd
join collection_series cs on cs.series_id = dd.series_id
group by dd.x
您還可以在group by
之前添加where條件
WHERE cs.collection_id = '265'
這是使它動態化的方法
set @sql = NULL;
select
group_concat(distinct
concat(
'max(case when cs.chart_name = ''',
cs.chart_name,
''' then dd.y end) AS ',
replace(cs.chart_name, ' ', '')
)
) INTO @sql
from collection_series cs
join datadatexnumericy dd on cs.series_id = dd.series_id
;
set @sql = concat('select dd.x as date, ', @sql, ' from datadatexnumericy dd
join collection_series cs on cs.series_id = dd.series_id
group by dd.x');
prepare stmt from @sql;
execute stmt;
deallocate prepare stmt;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.