0

我发现了一个类似的问题,但由于缺乏信息而没有解决方案。我有下面的代码,它将数据从连接的 MySQL DB 输出到以下格式的格式化 CSV 文件......</p>

名字:姓:GCNumber:部门:开始日期:介绍:理论:消防安全:治理:
约翰:史密斯:123456:HR:03/08/2013:通过:通过:失败:通过:
简:沃森:123445:IT:03/08/2013:通过:失败:通过:通过:
马克:拜伦:123442:IT:03/08/2013:失败:失败:未完成:未完成:

:= 仅用于显示每一列

它只是以相同的结构输出数据库中的所有行和列,并重命名列标题以在导入 Excel 时更友好。我需要将此输出的格式更改为以下...</p>

名字:姓:GCNumber:部门:电子邮件:开始日期:模块:状态:
约翰:史密斯:123456:HR:03/08/2013:简介:通过:
约翰:史密斯:123456:HR:03/08/2013:理论:通过:
约翰:史密斯:123456:HR:03/08/2013:消防安全:失败:
约翰:史密斯:123456:HR:03/08/2013:治理:通过:
Jane:Watson:123445:IT:03/08/2013:Introduction:Pass:
简:沃森:123445:IT:03/08/2013:理论:失败:
简:沃森:123445:IT:03/08/2013:消防安全:通过:
简:沃森:123445:IT:03/08/2013:治理:通过:
马克:拜伦:123442:IT:03/08/2013:简介:失败:
马克:拜伦:123442:IT:03/08/2013:理论:失败:
标记:拜伦:123442:IT:03/08/2013:消防安全:未完成:
马克:拜伦:123442:IT:03/08/2013:治理:未完成:

:= 仅用于显示每一列

因此,不是每个人都有一个条目,以及他们完成的每个模块的结果,我需要它是每个人完成的每个模块的单独条目。这个数据库和 35 个模块总共有更多的字段,但为了说明的目的,我已经把它删掉了。

作为一个 PHP 等的新手,我正在努力弄清楚如何做到这一点。这是可能的还是尝试将数据库的结构更改为所需的格式会更容易?

任何朝着正确方向的帮助或指示都会很棒。托尼

<?php

function exportMysqlToCsv($table,$filename = 'db-snapshot.csv')
{

    $sql_query = "select fldFirstname as 'First Name',
     fldSurname as 'Surname',
     fldGMCNumber as 'GCNumber', 
     fldDestDept as 'Dept',
     fldStartDate as 'Start Date',
     fldModule1 as 'Introduction',
     fldModule2 as 'Theory',
     fldModule3 as 'Fire Safety',
     fldModule4 as 'Governance'
     from $table";

    // Gets the data from the database
    $result = mysql_query($sql_query);

    $f = fopen('php://temp', 'wt');
    $first = true;
    while ($row = mysql_fetch_assoc($result)) {
        if ($first) {
            fputcsv($f, array_keys($row));
            $first = false;
        }
        fputcsv($f, $row);
    } // end while

    $size = ftell($f);
    rewind($f);

    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Content-Length: $size");

 // Output to browser with appropriate mime type, you choose ;)
    header("Content-type: text/x-csv");
    // header("Content-type: text/csv");
    // header("Content-type: application/csv");
    header("Content-Disposition: attachment; filename=$filename");
    fpassthru($f);
    exit;
}

?>
4

2 回答 2

1

您可以为此使用 UNIONS:

SELECT fldFirstname as 'First Name', fldSurname as 'Surname', 
  fldGMCNumber as 'GCNumber', fldDestDept as 'Dept', 
  fldStartDate as 'Start Date', fldEndDate as 'End Date', 
  'Introduction' as 'Module', fldModule1 as 'Status' FROM records
UNION
SELECT fldFirstname,fldSurname,fldGMCNumber,fldDestDept,fldStartDate,fldEndDate,
  'Theory',fldModule2 FROM records
UNION
SELECT fldFirstname,fldSurname,fldGMCNumber,fldDestDept,fldStartDate,fldEndDate,
  'Fire Safety',fldModule3 FROM records
UNION
SELECT fldFirstname,fldSurname,fldGMCNumber,fldDestDept,fldStartDate,fldEndDate,
  'Governance',fldModule4 FROM records
ORDER BY Surname, `First Name`, Module;

SQL 小提琴示例

于 2013-07-04T16:15:04.927 回答
0

我会在我对数据库的查询中使用一个支点。检查下
如果我有一个看起来像这样的 MySQL 表

所以你基本上会创建一个表,其中包含描述你的模块的行:

Module 
1 | Introduction 
2 | Theory 
3 | Fire Safety 
4 | Governance

然后将其加入上表并使用“Case”语法来实现您的请求。

于 2013-07-04T16:19:12.893 回答