#php #mysql #sql
#php #mysql #sql
Вопрос:
У меня есть SQL, который возвращает записи в таблице mysql. Каждая запись имеет много полей, и одно из полей называется «тип», которое является типом образца. Все образцы в целом классифицируются на шесть типов. Я отображаю все записи в таблице. Но я хочу сгруппировать данные по «типу» и показать отдельные таблицы с типом в качестве заголовка. В настоящее время я использую этот скрипт.
echo "<table class='wqtable'><tr><th>USIN</th><th>Type</th><th>Date of Coll.</th> <th>Location</th><th>Description</th><th>H3</th><th>Cs</th><th>Sr</th><th>Analyst</th></tr>";
while($data=mysql_fetch_array($result)){
echo "<tr>";
echo "<td>".$data['usin']."</td>";
echo "<td>".$data['type']."</td>";
echo "<td>".$data['doc1']."</td>";
echo "<td>".$data['location']."</td>";
echo "<td>".$data['description']."</td>";
echo "<td>".$data['h3']."</td>";
echo "<td>".$data['cs']."</td>";
echo "<td>".$data['sr']."</td>";
echo "<td>".$data['name']."</td>";
echo"</tr>";
}
echo "</table>";
При этом отображаются все записи в одной таблице. Я хочу разбить таблицу, когда отображаются все записи с одинаковым значением в поле типа, и начать новую таблицу для следующего типа образцов. (например, заголовок группы) Есть ли какой-нибудь простой способ, кроме запуска отдельных SQLL?
Ответ №1:
Убедитесь, что ваш SQL-запрос ORDER BY type
, а затем в вашем while
цикле вы могли бы сделать это:
$lastType = '';
echo '<table>';
while($data=mysql_fetch_array($result)) {
if($lastType != '' amp;amp; $lastType != $data['type']) {
echo '</table>';
echo '<table>';
}
echo "<tr>";
echo "<td>".$data['usin']."</td>";
echo "<td>".$data['type']."</td>";
echo "<td>".$data['doc1']."</td>";
echo "<td>".$data['location']."</td>";
echo "<td>".$data['description']."</td>";
echo "<td>".$data['h3']."</td>";
echo "<td>".$data['cs']."</td>";
echo "<td>".$data['sr']."</td>";
echo "<td>".$data['name']."</td>";
echo"</tr>";
$lastType = $data['type'];
}
echo '</table>';
Я не тестировал его, но при type
каждом изменении он вставляет закрывающий и открывающий table
тег (очевидно, вы можете добавить туда все, что захотите).
Ответ №2:
Я настроил хранимую процедуру SQL, в которой я группирую данные, используя методологию GROUP BY . Я взял эту технику из отчетов SSRS на Microsoft SQL Server. Я создаю представления, содержащие конкретную информацию, которую я могу часто использовать. Затем я выполняю хранимые процедуры, которые действуют как настройка источника данных в построителе отчетов или что-то в этом роде. Это автоматически сгруппирует данные для вас, после чего я смогу отфильтровать данные в структуре, подобной:
MainGroupA
Дочерняя группа
данные
данные
MainGroupB{
Дочерняя группа{
…
Ответ №3:
Если вы не хотите упорядочивать по типу в запросе, вместо этого вы можете создать свой HTML в виде массива. Например:
$table_types = array();
while($data = mysql_fetch_array($result))
{
$html = "";
$html .= "<tr>";
$html .= "<td>".$data['usin']."</td>";
$html .= "<td>".$data['type']."</td>";
$html .= "<td>".$data['doc1']."</td>";
$html .= "<td>".$data['location']."</td>";
$html .= "<td>".$data['description']."</td>";
$html .= "<td>".$data['h3']."</td>";
$html .= "<td>".$data['cs']."</td>";
$html .= "<td>".$data['sr']."</td>";
$html .= "<td>".$data['name']."</td>";
$html .= "</tr>";
$table_types[$data['type']][] = $html;
}
foreach($table_types as $type => $rows)
{
// Use a switch statement to put the correct text heading above the table.
echo "<h3>Type ".$type."</h3>";
echo "<table class='wqtable type-".$type."'><tr><th>USIN</th><th>Type</th><th>Date of Coll.</th><th>Location</th><th>Description</th><th>H3</th><th>Cs</th><th>Sr</th><th>Analyst</th></tr>";
echo implode($rows);
echo "</table>";
}
Комментарии:
1. Обратите внимание, что это не подходит, если у вас большой набор результатов, так как для этого потребуется достаточное количество памяти (потому что он сохраняет весь результат перед рендерингом).