Мне нужно экспортировать данные из 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
Это означает, что экспортируемый должен быть 2 участника с ParentID = 2, но у члена Майка Джонса есть ребенок (Джейсон Уильямс), который также необходимо экспортировать. У Майка Уильямса есть еще один ребенок (Сара Джонсон), который также нужно экспортировать. Другими словами, функция должна найти всех участников с ParentID = 2, а также детей и экспортировать их все. Спасибо за помощь.
$sql = "SELECT NAME, ID, PARENTID from tablename WHERE ID=2";
Чтобы найти все строки с ID = 2 (например, Mike и Amy), просто измените инструкцию MYSQL, чтобы включить предложение WHERE:
$sql = 'SELECT NAME, ID, PARENTID from tablename WHERE ID="2"';
Чтобы найти все строки с ID = 2 или строки, где родитель соответствует ID = 2 (например, Майк, Джейсон и Эми), вы можете использовать:
$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 самой строки, так и по PARENTID строки, соответствующей PARENTID.
Для одного дополнительного уровня рекурсивности (т. Е. Для поиска Майка, Джейсона, Эми и Сары) используйте:
$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'";