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 フィールドはidemployeedateおよびactionです。

今までやってきた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、管理者が日付を選択するフィールドがあり、<form>その部分は完了しました。

4

2 に答える 2

1

これは完全な答えではありませんが、空白の td は HTML テーブルで問題を引き起こすことに注意してください。  

<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 句があるのか​​と疑問に思われるかもしれません。それは、クエリを最適化できるように、日付にインデックスを持つことを利用できるようにするためです。現在のアプローチでは、2 つの計算値を比較しているため、インデックスを使用できません。また、年を考慮していないため (年の週のみ)、テーブルに 1 年以上のデータがある場合に問題が発生します。

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 に答える