如何在一行中显示签入表

时间:2014-09-10 13:26:55

标签: php mysql format

我有一张看起来像这样的表。

pers_id pers_name   pers_date   pers_date_attend_ind
431        Bacon    1/14/2013   N
431        Bacon    1/27/2013   N
431        Bacon    1/28/2013   N
431        Bacon    2/17/2013   N

我想在php中显示它

        <date 1>    <date 2>   <Date 3>
Bacon       N          N          N 

我对如何做到这一点感到茫然。

3 个答案:

答案 0 :(得分:1)

假设您的$rows变量将在获取结果后看起来像这样:

$rows = array(0 => array('pers_id' => 431, 'pers_name' => 'Bacon', 'pers_date' => '1/14/2013', 'pers_date_attend_ind' => 'N'),
              1 => array('pers_id' => 431, 'pers_name' => 'Bacon', 'pers_date' => '1/27/2013', 'pers_date_attend_ind' => 'N'),
              2 => array('pers_id' => 431, 'pers_name' => 'Bacon', 'pers_date' => '1/28/2013', 'pers_date_attend_ind' => 'N'),
              3 => array('pers_id' => 431, 'pers_name' => 'Bacon', 'pers_date' => '2/17/2013', 'pers_date_attend_ind' => 'N'),
        );

然后我玩这个数组使它看起来像这样:

Array
(
    [431] => Array
        (
            [name] => Bacon
            [dates] => Array
                (
                    [1/14/2013] => N
                    [1/27/2013] => N
                    [1/28/2013] => N
                    [2/17/2013] => N
                )

        )

)

使用foreach循环:

foreach($rows as $value)
{
    $array[$value['pers_id']]['name'] = $value['pers_name'];
    $array[$value['pers_id']]['dates'][$value['pers_date']] = $value['pers_date_attend_ind'];
}

现在看起来你的桌子准备好了。我创建了一个函数,它返回一个基于这个修改过的数组在你的问题中设置的表。

function generate_table($array)
{
    $html = '';
    foreach($array as $value)
    {
        $html .= '<table>'; // start table inside the loop. It will looks better due to each member may have different number of date count.
        $html .= '<tr>';
        $html .= '<td>&nbsp;</td>';
        foreach($value['dates'] as $k => $v)
        {
            $html .= '<td>' . $k . '</td>';
        }
        $html .= '</tr>';
        $html .= '<tr>';
        $html .= '<td>' . $value['name'] . '</td>';
        foreach($value['dates'] as $v)
        {
            $html .= '<td>' . $v . '</td>';
        }
        $html .= '</tr>';
        $html .= '</table>';
    }
    return $html;
}

这个功能看起来有点讨厌,但它确实有效。如果你愿意,可以改进这个功能。

实时预览

结果预览

Results...

答案 1 :(得分:0)

您想要的是一个简单的SELECT查询,以便为一个人获取所有pers_datepers_date_attend_ind,并将其限制为仅三个结果。

SELECT `pers_date`, `pers_date_attend_ind` FROM `table` WHERE `pers_id` = 431 ORDER BY `pers_date` DESC LIMIT 3

然后只需获取结果并使用php打印它们。

答案 2 :(得分:0)

不幸的是,mysql没有魔术功能来将变量值转换为列名,但在你的情况下,你应该有一个额外的列(date_number我已经在演示中添加了它),它计算了添加的日期数。

这是对它的批评:

    select `pers_name`,

    max(case when `date_number` = 1 then `pers_date_attend_ind` end) as date1,
    max(case when `date_number` = 2 then `pers_date_attend_ind` end) as date2,
    max(case when `date_number` = 3 then `pers_date_attend_ind` end) as date3,
    max(case when `date_number` = 4 then `pers_date_attend_ind` end) as date4
    from Table1

HERE demo to play with