combine/merge html table 行从 mysql 和 php 枢轴 table 合并为一行
combine/merge html table rows into one from mysql and php pivot table
我有一个 mysql table 的时间表:
+-------------+--------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+-------------------+-----------------------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| identity | int(11) | NO | MUL | NULL |
| start | datetime | YES | MUL | NULL | |
| end | datetime | YES | MUL | NULL |
+-------------+--------------+------+-----+-------------------+-----------------------------+
我有一个 php 脚本:
$begin = new DateTime( $_SESSION['start'] );
$end = new DateTime( $_SESSION['end'] );
$interval = DateInterval::createFromDateString('1 day');
$period = new DatePeriod($begin, $interval, $end);
foreach ( $period as $dt )
$massivequery[]= "case(date(start)) when '".$dt->format( "Y-m-d" )."' then hour(timediff(end,start)) end as '".$dt->format( "Y-m-d" )."'";
$view_start = $_SESSION['start'];
$view_end = $_SESSION['end'];
$result = mysqli_query($con,"
select schedule.identity,".implode(',',$massivequery)." from schedule join names on schedule.id_code=names.id_code where schedule.away is null and schedule.errand is null and date(schedule.start) between '".$view_start."' and '".$view_end."'
");
echo "<table align='center' border='1'>";
$i = 0;
while($row = $result->fetch_assoc())
{
if ($i == 0) {
$i++;
echo "<tr>";
foreach ($row as $key => $value) {
echo "<th>" . $key . "</th>";
}
echo "</tr>";
}
echo "<tr>";
foreach ($row as $value) {
echo "<td id='".$row['identity']."'>" . $value . "</td>";
}
echo "</tr>";
}
echo "</table>";
问题是这给了我几乎完美的 table 我需要的。它是旋转的,所有 table 标题都是正确的,但问题是它为每个人按计划安排的每一天提供单独的一行。我想将具有相同 ID 的行合并为一行。我不是指 colspan 或 rowspan。
我得到的table
<table align="center" border="1">
<tbody>
<tr><th>identity</th>
<th>2017-03-20</th>
<th>2017-03-21</th>
<th>2017-03-22</th></tr>
<tr><td id="12345">12345</td>
<td id="12345">8</td>
<td id="12345"></td>
<td id="12345"></td></tr>
<tr><td id="12345">12345</td>
<td id="12345"></td>
<td id="12345">8</td>
<td id="12345"></td></tr>
<tr><td id="12345">12345</td>
<td id="12345"></td>
<td id="12345"></td>
<td id="12345">8</td></tr>
</tbody></table>
我想要的 table
<table align="center" border="1">
<tbody>
<tr><th>identity</th>
<th>2017-03-20</th>
<th>2017-03-21</th>
<th>2017-03-22</th></tr>
<tr><td id="12345">12345</td>
<td id="12345">8</td>
<td id="12345">8</td>
<td id="12345">8</td></tr>
</tbody></table>
这只是一个简单数据的简单示例。我实际上有大约 40-50 个不同的身份,通常的长度是 30 天而不是 3 天。该查询依赖于另一个应用程序,因此我必须能够使用 session 变量来说明时间段。这就是为什么我不能手动建立一个适当的 mysql 查询(或者至少我不知道如何)。
再一次,我很确定有某种超级优雅和简单的方法可以用 jquery 来做到这一点,但我没有看到如何。
我只需要编辑 mysql 查询就可以了。太简单了。
我编辑了这个(添加了带有分隔符 '+' 的 group_concat() 函数):
$massivequery[]= "group_concat(case(date(start)) when '".$dt->format( "Y-m-d" )."' then hour(timediff(end,start)) end SEPARATOR ' + ') as '".$dt->format( "Y-m-d" )."'";
和这个(添加分组依据):
select schedule.identity,".implode(',',$massivequery)." from schedule join names on schedule.id_code=names.id_code where schedule.away is null and schedule.errand is null and date(schedule.start) between '".$view_start."' and '".$view_end."' group by schedule.identity
现在我有一个完全动态的枢轴 table。
我有一个 mysql table 的时间表:
+-------------+--------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+-------------------+-----------------------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| identity | int(11) | NO | MUL | NULL |
| start | datetime | YES | MUL | NULL | |
| end | datetime | YES | MUL | NULL |
+-------------+--------------+------+-----+-------------------+-----------------------------+
我有一个 php 脚本:
$begin = new DateTime( $_SESSION['start'] );
$end = new DateTime( $_SESSION['end'] );
$interval = DateInterval::createFromDateString('1 day');
$period = new DatePeriod($begin, $interval, $end);
foreach ( $period as $dt )
$massivequery[]= "case(date(start)) when '".$dt->format( "Y-m-d" )."' then hour(timediff(end,start)) end as '".$dt->format( "Y-m-d" )."'";
$view_start = $_SESSION['start'];
$view_end = $_SESSION['end'];
$result = mysqli_query($con,"
select schedule.identity,".implode(',',$massivequery)." from schedule join names on schedule.id_code=names.id_code where schedule.away is null and schedule.errand is null and date(schedule.start) between '".$view_start."' and '".$view_end."'
");
echo "<table align='center' border='1'>";
$i = 0;
while($row = $result->fetch_assoc())
{
if ($i == 0) {
$i++;
echo "<tr>";
foreach ($row as $key => $value) {
echo "<th>" . $key . "</th>";
}
echo "</tr>";
}
echo "<tr>";
foreach ($row as $value) {
echo "<td id='".$row['identity']."'>" . $value . "</td>";
}
echo "</tr>";
}
echo "</table>";
问题是这给了我几乎完美的 table 我需要的。它是旋转的,所有 table 标题都是正确的,但问题是它为每个人按计划安排的每一天提供单独的一行。我想将具有相同 ID 的行合并为一行。我不是指 colspan 或 rowspan。 我得到的table
<table align="center" border="1">
<tbody>
<tr><th>identity</th>
<th>2017-03-20</th>
<th>2017-03-21</th>
<th>2017-03-22</th></tr>
<tr><td id="12345">12345</td>
<td id="12345">8</td>
<td id="12345"></td>
<td id="12345"></td></tr>
<tr><td id="12345">12345</td>
<td id="12345"></td>
<td id="12345">8</td>
<td id="12345"></td></tr>
<tr><td id="12345">12345</td>
<td id="12345"></td>
<td id="12345"></td>
<td id="12345">8</td></tr>
</tbody></table>
我想要的 table
<table align="center" border="1">
<tbody>
<tr><th>identity</th>
<th>2017-03-20</th>
<th>2017-03-21</th>
<th>2017-03-22</th></tr>
<tr><td id="12345">12345</td>
<td id="12345">8</td>
<td id="12345">8</td>
<td id="12345">8</td></tr>
</tbody></table>
这只是一个简单数据的简单示例。我实际上有大约 40-50 个不同的身份,通常的长度是 30 天而不是 3 天。该查询依赖于另一个应用程序,因此我必须能够使用 session 变量来说明时间段。这就是为什么我不能手动建立一个适当的 mysql 查询(或者至少我不知道如何)。 再一次,我很确定有某种超级优雅和简单的方法可以用 jquery 来做到这一点,但我没有看到如何。
我只需要编辑 mysql 查询就可以了。太简单了。
我编辑了这个(添加了带有分隔符 '+' 的 group_concat() 函数):
$massivequery[]= "group_concat(case(date(start)) when '".$dt->format( "Y-m-d" )."' then hour(timediff(end,start)) end SEPARATOR ' + ') as '".$dt->format( "Y-m-d" )."'";
和这个(添加分组依据):
select schedule.identity,".implode(',',$massivequery)." from schedule join names on schedule.id_code=names.id_code where schedule.away is null and schedule.errand is null and date(schedule.start) between '".$view_start."' and '".$view_end."' group by schedule.identity
现在我有一个完全动态的枢轴 table。