Intereting Posts

отображение результата запроса php mysql с отношением один к другому

Heres Образец таблицы:

info table info_id name 1 john 2 peter ------------------------ details table details_id log date 1 test log for john 2013-08-01 1 another log for john 2013-08-02 2 test log for peter 2013-08-02 

Вот мой пример запроса:

 SELECT info.info_id, info.name, details.details_no, details.log, details.date FROM info JOIN details ON details.details_id = info.info_id GROUP BY info.info_id 

И вот дисплей, который я хочу достичь:

 john 1 test log for john 2013-08-01 1 another test log for john 2013-08-02 peter 2 test log for peter 213-08-02 

Я попытался использовать цикл foreach, а затем выполнить другой цикл foreach внутри первого цикла.

Пожалуйста, помогите парням

Вероятно, вам придется взять данные и сделать массив, который вы хотите.

 $data = array(); foreach ($result as $item) { $key = $item['name']; // or $item['info_id'] if (!isset($data[$key])) { $data[$key] = array(); } $data[$key][] = $item; } // Build your table with the new $data array 

РЕДАКТИРОВАТЬ

Это просто пример. Как указывает Amaster507, если ваше поле name не уникально, вам нужно будет создать массив на уникальном ключе. Не очень сильно отличается от этого, так как вы могли бы просто изменить экземпляры $item['name'] на $item['info_id'] .

Попробуйте сделать результаты в многомерном массиве, как показано ниже.

Примечание. Я предполагаю, что details.details_no является первичным ключом для таблицы details и вам нужны результаты, похожие на

 john 1 test log for john 2013-08-01 2 another test log for john 2013-08-02 peter 3 test log for peter 213-08-02 

Который вы можете получить со следующим

 ... $qry = " SELECT info.info_id, info.name, details.details_no, details.log, details.date FROM info JOIN details ON (details.details_id = info.info_id) "; $result = mysqli_query($your_db_link,$qry) $data = array(); while($row = mysqli_fetch_array($result)){ $data[$row["info_id"]]["name"] = $row["name"]; $data[$row["info_id"]]["logs"][$row["details_no"]] = array( "log"=>$row["log"], "date"=>$row["date"], ); } 

Результатом будет массив:

 $data = array( "1" => array( "name" => "john", "logs" => array( "1" => array( "log" => "test log for john", "date" => "2013-08-01", ), "2" => array( "log" => "another test log for john", "date" => "2013-08-02", ), ), ), "2" => array( "name" => "peter", "logs" => array( "3" => array( "log" => "test log for peter", "date" => "2013-08-02", ), ), ), ); 

Затем вы можете отобразить как:

 echo "<table>"; foreach($data as $value){ echo "<tr><td colspan='3'>".$value["name"]."</td></tr>"; foreach($value["logs"] as $subkey => $subvalue){ echo "<tr>"; echo "<td>".$subkey."</td>"; echo "<td>".$subvalue["log"]."</td>"; echo "<td>".$subvalue["date"]."</td>"; echo "</tr>"; } } echo "</table>"; 

Который приведет к сходному с:

 <table> <tr> <td colspan='3'>john</td> </tr> <tr> <td>1</td> <td>test log for john</td> <td>2013-08-01</td> </tr> <tr> <td>2</td> <td>another test log for john</td> <td>2013-08-02</td> </tr> <tr> <td colspan='3'>peter</td> </tr> <tr> <td>3</td> <td>test log for peter</td> <td>2013-08-02</td> </tr> </table> 

вы пробовали foreach с парой ключ / значение? можете ли вы показать нам свои петли в настоящее время? print_r / var_dump для результирующего массива облегчит кому-то помощь.

 foreach ($result as $key=>$value) { print "Name Row\n"; for (each display row) { 

Это или как Ascherer предлагает создать новый многомерный массив, который сделает ненужными вложенные петли.

Хорошо, сначала объяснение проблемы.

Когда вы используете GROUP BY , вы больше не получаете каждый результат в виде строки, но вместо этого вы получаете 1 строку с групповым контентом, то есть вы можете использовать GROUP BY чтобы получить что-то вроде конкатенации обеих log ячеек от john, например ,

Чтобы сделать то, что вы хотите, удалите GROUP BY чтобы получить все строки, а затем вручную обработать их.

Я рекомендую вам упростить работу, чтобы использовать underscore.php, который имеет функцию groupBy которая вернет массив, сгруппированный в подмассивах, на основе этого случая, столбца info_id .

Он будет использоваться примерно так:

 $array_with_all_the_rows = $query->fetchAll(); // Or whatever you use to get all rows in 1 array. $grouped_array = __::groupBy($array_with_all_the_rows, 'info_id'); 

Этот сгруппированный массив будет таким:

 $grouped_array = Array( "1" => Array( "info_id"=> "1", "log"=>"test log for john", "date" => "2013-08-01", "info_id"=> "1", "log"=>"another test log for john", "date" => "2013-08-02" ), "2" => Array( "info_id"=> "2", "log"=>"test log for peter", "date" => "2013-08-02" ) )