繁体   English   中英

PHP从MySQL导出到CSV

[英]PHP export from MySQL into CSV

我需要将数据从MySQL导出到CSV,但要从特定ID导出。 该表包含ID,ParentID和Name,这是导出所有记录的代码:

    <?php
    $servername = "localhost";
    $username = "root";
    $password = "";
    $dbname = "databasename";
    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);
    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    } 
    $index = array();
    $num = 0;
    $sql = "SELECT NAME, ID, PARENTID from tablename";
    $result = $conn->query($sql);

    while($row = $result->fetch_array(MYSQLI_ASSOC)){
      $rows[] = $row;
      $index[$row['ID']] = $row;  
    }

    $output = fopen("php://output",'w') or die("Can't open php://output");
    header("Content-Type:application/csv"); 
    fputcsv($output, array('ID','NAME','PARENTID'));

    // build the tree
    foreach($index as $id => &$row){
      if ($id === 0) continue;
      $parent = $row['PARENTID'];
      $index[$parent][] = &$row;
      fputcsv($output, $row);
    }
    fclose($output) or die("Can't close php://output");
    unset($row);

    // start from this ID
    $index = $index[2];

    /* free result set */
    $result->close();
    /* close connection */
    $conn->close();

如果我的表中有这个( 这是表声明 ):

ID  PARENT    NAME
1     0       John Doe
2     1       Sally Smith
3     2       Mike Jones
4     3       Jason Williams
5     4       Sara Johnson
6     1       Dave Wilson
7     2       Amy Martin

如何导出parentID = 2(递归)的成员的所有子代? 换句话说,我需要这样的输出:

  ID  PARENT    NAME
  3   2         Mike Jones
  4   3         Jason Williams
  5   4         Sara Johnson
  7   2         Amy Martin

这意味着,导出的必须是ParentID = 2的2个成员,但是成员Mike Jones的孩子(Jason Williams)也需要导出。 迈克·威廉姆斯还有一个孩子(萨拉·约翰逊),也需要出口。 换句话说,函数需要查找ParentID = 2的所有成员,但也要找到所有成员并将其全部导出。 谢谢您的帮助。

要查找ID = 2的所有行(即Mike和Amy),只需修改您的MYSQL语句以包含WHERE子句:

    $sql = 'SELECT NAME, ID, PARENTID from tablename WHERE ID="2"';

要查找所有ID = 2的行,或查找父级对应于ID = 2的行(即Mike,Jason和Amy),可以使用:

    $sql = 'SELECT t1.NAME FROM test2 AS t1 JOIN test2 AS t2 ON t1.PARENTID = t2.ID WHERE t1.PARENTID = "2" OR t2.PARENTID = "2"';

JOIN执行“递归”位,在PARENTID列中查找值的ID,以便您可以查询行本身的ID以及与PARENTID对应的行的PARENTID的每一行。

要获得更高级别的递归性(即查找Mike,Jason,Amy和Sara),请使用:

    $sql = 'SELECT t1.NAME FROM test2 AS t1 JOIN test2 AS t2 ON t1.PARENTID = t2.ID JOIN test2 AS t3 ON t1.PARENTID = t3.ID WHERE t1.PARENTID = '2' OR t2.PARENTID = '2' OR t3.PARENTID = '3'';

在此解决方案中,您将需要为递归的每个级别添加一个额外的联接。

$sql = "SELECT NAME, ID, PARENTID from tablename WHERE ID=2";
 $sql = "SELECT NAME, ID, PARENTID from tablename Where ID='2'";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM