0

我正在编写一个显示本周所有员工计划的脚本。为了参加本周的课程,我使用:

SELECT * FROM program
WHERE WEEKOFYEAR(date) = WEEKOFYEAR(NOW())
ORDER BY employee ASC

该脚本使用 PHP 生成一个 HTML 表格,这是表格的结构:

===============================================================
| Employee | Monday | Tuesday | Wednesday | Thursday | Friday |
===============================================================

管理员选择员工执行操作的日期,并将其插入 MySQL 数据库。

这就是我想要得到的:

===============================================================
| Employee | Monday | Tuesday | Wednesday | Thursday | Friday |
===============================================================
| John     | Deliver|         | Deliver   |          |        |
---------------------------------------------------------------
| Steve    |        | Deliver | Deliver   |          | Deliver|
---------------------------------------------------------------

如何使脚本检测员工将从数据库中执行操作的星期几?员工可以每天工作,也可以每周只工作几天,所以我需要<td>在对那个人无事可做的地方显示一个空白。

MySQL 字段是idemployee和。dateaction

我可以发布我到目前为止所做的事情,但它很简单while,只插入名称,因为我不知道如何做剩下的事情。我需要一个想法。

根据要求,这是我的代码示例:

$query = mysql_query("SELECT * FROM program WHERE WEEKOFYEAR(date)=WEEKOFYEAR(NOW()) ORDER BY employee ASC");
    echo '<table border="0" cellspacing="0"><tr>
                            <th>Employee</th>
                            <th>Monday</th>
                            <th>Tuesday</th>
                            <th>Wednesday</th>
                            <th>Thursday</th>
                            <th>Friday</th>
                            </tr>';
    while ($row = mysql_fetch_assoc($query)) {
    echo "<tr><td> $row[employee] </td></tr>";
}
echo "</table>";
    ?>

数据库中的表有一个date字段,管理员在其中通过 a 选择日期<form>,我已经完成了那部分。

4

2 回答 2

1

这不是一个完整的答案,但请注意空白 td 会导致您在 HTML 表格中出现问题,因此请务必在任何空白 td 中放置一个不间断的空格,使用  

<td>&nbsp;</td>
于 2013-10-30T20:15:11.483 回答
0

MySQL 没有对您要执行的那种交叉表查询的内置支持。您可以将一个丑陋的查询与一堆 CASE 语句放在一起,以您希望的交叉表格式返回您的数据,但由于这可以在应用程序逻辑中轻松完成,这可能不是最好的方法。我的建议是这样查询:

SELECT employee, WEEKDAY(date) as day_index
FROM program
WHERE
date BETWEEN
  STR_TO_DATE(CONCAT(YEARWEEK(NOW(),0), ' Sunday', '%X%V %W') AND
  STR_TO_DATE(CONCAT(YEARWEEK(NOW(),0), ' Saturday', '%X%V %W')
ORDER BY employee ASC, day_index ASC

你可能会问为什么会有这么奇怪的 WHERE 子句。好吧,您可以利用日期索引来优化查询。您当前的方法不允许在比较两个计算值时使用索引。它也没有考虑年份(仅考虑一年中的一周),如果表中的数据超过一年,这将导致问题。

您可以很容易地计算 PHP 中的日期范围并将 where 子句更改为:

WHERE date BETWEEN ? AND ?

这将给出如下结果:

TED | 0  <--- Sunday
TED | 2  <--- Tuesday
BILL | 1 <--- Monday

然后,您可以使用结果集构建一个多维数组:

$table = array();
while $row = (/* your MySQL row retrieval method here */)
    $table[$row['employee']][] = $row['day_index'];
}

这样可以很容易地输出您的表格,例如:

// not shown: output table header before this loop

foreach($table as $employee => $days) {
    echo '<tr><td>'. $employee . '</td>';
    for ($i = 0; $i++; $i < 7) { // you could use ($i = 1; $i++; $ < 6) if you want only weekdays in output
        if (in_array((string)$i, $days)) {
            echo '<td>Delivery</td>';
        } else {
            echo '<td></td>';
        }
    }
    echo '</tr>';
}
于 2013-10-30T21:07:19.300 回答