0

私のコンフォートゾーンから少し外れて、私が必要とするものを達成するための最良の方法を誰かが説明してくれることを願っています.

非常にシンプルなスタッフ出勤制度です。

スタッフ テーブルには、スタッフ メンバーの名前が含まれます。

出席テーブルには、その日に働いた日付とシフトの種類 (フル/ハーフ/1 日半) が含まれます。

ここでやりたいことは、2 つの日付 (支払い期間) 間のすべてのスタッフの出席を示すテーブルとしてレポートを作成することです。

最初の列はスタッフ名である必要があり、その後の列は 2 つの日付 (start_date と end_date) の間の各日付で始まり、テーブルの残りの部分にメンバーのシフトを入力したいと考えています。スタッフは特定の日に働きました。

したがって、次のようになります。

     Name     |  2013-05-26  |   2013-05-27   |   etc
     -------------------- ---------------------------
     John     |     full     |      half      |
     Mary     |     off      |      full      |
     Peter    |     half     |      full      |

次のクエリでは、すべてのデータが得られます。

SELECT a.id, first_name, last_name, attDate, staff_id, att, late
FROM staff as a LEFT OUTER JOIN staff_attendance AS b
  ON a.id = b.staff_id 
    AND b.`attDate` >= '2013-05-26' 
    AND  b.`attDate` <= '2013-06-27' 
ORDER BY last_name, attDate;

基本的には次のようになります。

    id  |   first_name   | last_name |  attDate    | staff_id | att   |  late
    ------------------------------------------------------------------------
    1   |     John       |    smith  | 2013-05-26  |     1    | full  |    0
    1   |     John       |    smith  | 2013-05-27  |     1    | half  |    0
    2   |     Mary       |    Jones  | 2013-05-26  |     2    | off   |    0
    2   |     Mary       |    Jones  | 2013-05-27  |     2    | full  |    0
    3   |     Peter      |    Doe    | 2013-05-26  |     3    | half  |    0
    3   |     Peter      |    Doe    | 2013-05-26  |     3    | full  |    0

ご覧のとおり、私はすべてのデータを持っていますが、それをテーブルに入れる方法がわかりません。

ご意見やご提案は大歓迎です。

どうもありがとう

グレアム

dev-null-dweller からのアドバイスに従って、次のコードがあります。

    $dbh = new PDO("mysql:host=$hostname;dbname=web14-fresh", $username, $password);
    $sql = "SELECT a.id, first_name, last_name, attDate, staff_id, att, late FROM staff as a LEFT OUTER JOIN staff_attendance AS b ON a.id = b.staff_id AND b.`attDate` >= '" .                   $startdate. "' AND  b.`attDate` <= '". $enddate . "' ORDER BY last_name, attDate;";
    $stmt = $dbh->query($sql);

    $dates = array();
    $users = array();

    while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
        $dates[] = $row['attDate'];
        if (!isset($users[$row['id']])) {
            $users[$row['id']] = array(
                'first_name' => $row['first_name'], 
                'last_name' => $row['last_name'],
                'attendance' => array()
            );
        }
        $users[$row['id']]['attendance'][$row['attDate']] = $row['att'];
    }

    $dates = array_unique($dates);
    sort($dates);

    // header
    echo '<table border=1><tr>';
    echo '<td>Name</td>';
    foreach($dates as $d){
        echo '<td>'.$d.'</td>';
    }
    echo '</tr>';

    //data
    foreach($users as $u) {
        echo '<tr><td>'.$u['first_name'].'</td>';
        foreach($dates as $d) {
            if (isset($u['attendance'][$d])) {
                echo '<td>'.$u['attendance'][$d].'</td>';
            } else {
                echo '<td>?</td>';
            }
        }
        //end row
        echo '</tr>';
    }
    echo '</table>';

これは、上部のすべての日付を入力していないようで、理由がわかりません。これは私が得ているものです。

    Name        2013-06-26
    Katy    ?   full
    Lauren  ?   full
    Laura   ?   full
    Louise  ?   holiday
    Jade    ?   off

日付配列が正しく入力されていないかどうかはよくわかりません:-/

4

4 に答える 4

2

私のコメントを説明するためのコード:

$dates = array();
$users = array();

while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
    $dates[] = $row['attDate'];
    if (!isset($users[$row['id']])) {
        $users[$row['id']] = array(
            'first_name' => $row['first_name'], 
            'last_name' => $row['last_name'],
            'attendance' => array()
        );
    }
    $users[$row['id']]['attendance'][$row['attDate']] = $row['att'];
}

$dates = array_unique($dates);
sort($dates);

// header
//echo 'name';
foreach($dates as $d){
    echo $d;
}

//data
foreach($users as $u) {
    //echo $u['first_name'];
    foreach($dates as $d) {
        if (isset($u['attendance'][$d])) {
            echo $u['attendance'][$d];
        } else {
            // for missing records?
        }
    }
    //end row
}
于 2013-06-26T23:29:04.590 に答える
1

SQL の結果を出力するために使用する基本的な出力ループを次に示します。$keyここから、値またはあなたが持っているものに基づいた条件付き書式を使用して拡張できます。

printf()およびsprintf()関数も非常に便利なので、親しみやすくする必要があります。

$rs; // assuming this is an indexed array of rows returned from your DB
// ie: $rs[0]['id']

$output = '<table>';

//print header row by iterating through the first result row and printing the keys
$output .= '<tr>';
foreach($rs[0] as $key => $value) {
  $output .= sprintf('<td>%s</td>', $key);
}
$output .= '</tr>';

//now the data rows
foreach($rs as $row) {
  $output .= '<tr>';
  foreach($row as $key => $value) {
    $output .= sprintf('<td>%s</td>', $value);
  }
  $output .= '</tr>';
}

$output .= '</table>';
echo $output;
于 2013-06-26T22:53:35.667 に答える
-1

結果を HTML テーブルにエコーできます。まず、見出しを作成します。

echo '<table>';
echo '<tr><td>Column 1</td><td>Column 2</td><td>Column 3</td>......</tr>';

次に、SQL クエリ (SELECT) を実行します。

$result = mysql_query("SELECT * FROM table ... ...");

この後、「while」を使用して結果を反復処理できます。

while ($row = mysql_fetch_array($result ) ) {
echo '<tr><td>'.$row['name_of_column_1_in_db'].'</td><td>'.$row['name_of_column_2_in_db'].'</td> .......... </tr>';
}

次に、テーブル タグを閉じます。

echo '</table>';
于 2013-06-26T22:46:26.733 に答える