Php MySQL中的列合并
我每年都试图在我的数据库中可视化模式。我的数据库是MySQL,服务器端语言是PHP,数据可视化工具是 我已经一年一年地导出数据,并且一直在尝试使用PHP合并这些数据,但是效率的顺序非常糟糕而且不直观,所以我希望在MySQL中合并列,而不是在PHP中合并列 我提取数据,以便每年1月7日代表Php MySQL中的列合并,php,mysql,database,primary-key,Php,Mysql,Database,Primary Key,我每年都试图在我的数据库中可视化模式。我的数据库是MySQL,服务器端语言是PHP,数据可视化工具是 我已经一年一年地导出数据,并且一直在尝试使用PHP合并这些数据,但是效率的顺序非常糟糕而且不直观,所以我希望在MySQL中合并列,而不是在PHP中合并列 我提取数据,以便每年1月7日代表1月1日+2月2日+…+1月7日和12月31日代表1月1日3月25日+…+12月31日。这都是在一年内完成的,因此2012列仅在2012年累积 2014年的数据看起来是 +--------+-------+ |
1月1日+2月2日+…+1月7日和12月31日代表1月1日3月25日+…+12月31日
。这都是在一年内完成的,因此2012列仅在2012年累积
2014年的数据看起来是
+--------+-------+
| date | books |
+--------+-------+
| Jan-01 | 17 |
| Jan-02 | 40 |
| Jan-03 | 99 |
| Jan-04 | 164 |
| Jan-05 | 307 |
| Jan-06 | 527 |
| Jan-07 | 744 |
| Jan-08 | 866 |
| Jan-09 | 941 |
| Jan-10 | 990 |
| Jan-11 | 1016 |
| Jan-12 | 1030 |
| Jan-13 | 1082 |
+--------+-------+
现在我像这样提取数据
<?php
// the actual code includes data for 2010-2014
$sql2014Cumulative = "SELECT DATE_FORMAT(b.`date_added`, '%b-%d') AS date, COUNT(*) AS books\n"
. "FROM (SELECT DISTINCT date(`date_added`) `date_added` FROM `books` WHERE YEAR(`date_added`) = 2014) b\n"
. "JOIN `books` b2 ON b.`date_added` >= date(b2.`date_added`)\n"
. "WHERE YEAR(b2.`date_added`) = 2014\n"
. "GROUP BY b.`date_added`\n"
. "ORDER BY b.`date_added` ASC";
$sql2013Cumulative = "SELECT DATE_FORMAT(b.`date_added`, '%b-%d') AS date, COUNT(*) AS books\n"
. "FROM (SELECT DISTINCT date(`date_added`) `date_added` FROM `books` WHERE YEAR(`date_added`) = 2013) b\n"
. "JOIN `books` b2 ON b.`date_added` >= date(b2.`date_added`)\n"
. "WHERE YEAR(b2.`date_added`) = 2013\n"
. "GROUP BY b.`date_added`\n"
. "ORDER BY b.`date_added` ASC";
$result2014Cumulative = $mysqli->query($sql2014Cumulative);
$result2013Cumulative = $mysqli->query($sql2013Cumulative);
while($row2014Cumulative = $result2014Cumulative->fetch_array(MYSQLI_ASSOC))
{
$rows2014Cumulative[] = array('date' => $row2014Cumulative['date'], '2014' => $row2014Cumulative['books']);
}
while($row2013Cumulative = $result2013Cumulative->fetch_array(MYSQLI_ASSOC))
{
$rows2013Cumulative[] = array('date' => $row2013Cumulative['date'], '2013' => $row2013Cumulative['books']);
}
$mergedDataCumulative = array_replace_recursive($rows2013Cumulative, $rows2014Cumulative);
?>
<script>var booksYearOverYearCumulative = <?php echo json_encode($mergedDataCumulative); ?>;</script>
...
然后,我将每年收集的每一组数据合并到一个数组中,并导出到Morris.js的JSON中。这是乏味和混乱的部分
更简单的是,如果这一切都是在MySQL中完成的,并且数据导出到一个表中并显示出来
+--------+-------+-------+-------+
| date | 2014 | 2013 | 2012 |
+--------+-------+-------+-------+
| Jan-01 | 17 | 12 | 0 |
| Jan-02 | 40 | 40 | 12 |
| Jan-03 | 99 | 102 | 18 |
| Jan-04 | 164 | 136 | 27 |
| Jan-05 | 307 | 144 | 45 |
| Jan-06 | 527 | 504 | 48 |
| Jan-07 | 744 | 893 | 189 |
| Jan-08 | 866 | 1002 | 567 |
| Jan-09 | 941 | 1100 | 890 |
| Jan-10 | 990 | 1430 | 1054 |
| Jan-11 | 1016 | 1435 | 1278 |
| Jan-12 | 1030 | 1545 | 1575 |
| Jan-13 | 1082 | 1604 | 1897 |
+--------+-------+-------+-------+
因此,与使用PHP合并所有数据相比,有人知道我如何在每年内按天对累积数据进行分组并将其导出到一个表中吗?这是您的查询,已清理为SQL:
SELECT DATE_FORMAT(b.`date_added`, '%b-%d') AS date, COUNT(*) AS books
FROM (SELECT DISTINCT date(`date_added`) `date_added`
FROM `books`
WHERE YEAR(`date_added`) = 2014
) b JOIN
`books` b2
ON b.`date_added` >= date(b2.`date_added`)
WHERE YEAR(b2.`date_added`) = 2014
GROUP BY b.`date_added`
ORDER BY b.`date_added` ASC;
让我们修改它以处理多年。我认为这样做:
SELECT DATE_FORMAT(b.`date_added`, '%b-%d') AS date,
sum(b.yr = 2014) AS books_2014,
sum(b.yr = 2013) AS books_2013,
sum(b.yr = 2012) AS books_2012
FROM (SELECT DISTINCT date(`date_added`) as date_added, year(date_added) as yr
FROM `books`
) b JOIN
`books` b2
ON b.`date_added` >= date(b2.`date_added`) and
b.yr = year(b2.date_added)
GROUP BY DATE_FORMAT(b.`date_added`, '%b-%d')
ORDER BY `date` ASC;
使用简单大小写时
select
b.date 'date',
sum(b.y2014) '2014',
sum(b.y2013) '2013',
sum(b.y2012) '2012'
from (
select
date_format(date_added, '%b-%d') as 'date',
case year(date_added) when 2014 then books else 0 end as 'y2014',
case year(date_added) when 2013 then books else 0 end as 'y2013',
case year(date_added) when 2012 then books else 0 end as 'y2012'
from books
) b
group by b.date;
带有连接
select
date_format(y14.date_added, '%b-%d') as 'date',
y14.books as '2014',
y13.books as '2013',
y12.books as '2012'
from
books y14
left join books y13
on year(y13.date_added) = 2013
and month(y13.date_added) = month(y14.date_added)
and day(y13.date_added) = day(y14.date_added)
left join books y12
on year(y12.date_added) = 2012
and month(y12.date_added) = month(y14.date_added)
and day(y12.date_added) = day(y14.date_added)
where
year(y14.date_added) = 2014
;
你可以用很多不同的方法,联合所有人,等等
我忘了说这是多么不可思议的帮助,谢谢!我不知道您可以修改数据来创建这样的范围。我可以研究一下这个概念的名字吗?不客气,谢谢你的评论。我不确定你的问题。但是如果您想知道
select
,那么它可能会被称为nestedselect
或sql子查询
。这是一种在查询中进行查询的方法。祝你好运
select
date_format(y14.date_added, '%b-%d') as 'date',
y14.books as '2014',
y13.books as '2013',
y12.books as '2012'
from
books y14
left join books y13
on year(y13.date_added) = 2013
and month(y13.date_added) = month(y14.date_added)
and day(y13.date_added) = day(y14.date_added)
left join books y12
on year(y12.date_added) = 2012
and month(y12.date_added) = month(y14.date_added)
and day(y12.date_added) = day(y14.date_added)
where
year(y14.date_added) = 2014
;