Я боролся некоторое время с этим; я попытаюсь объяснить это здесь максимально максимально.
Рассмотрите эту таблицу MySQL:
+----------+-----------+---------+--------+
|status_id |session_id |pilot_id |present |
+----------+-----------+---------+--------+
|1 |61 |901 |1 |
|2 |63 |901 |1 |
|3 |62 |901 |0 |
|4 |62 |902 |1 |
|5 |63 |903 |1 |
+----------+-----------+---------+--------+
Оба session_id
и pilot_id
внешние ключи, ссылающиеся на первичный ключ в другой таблице. То же pilot_id
может быть связан с различным session_id
, но каждый pilot_id
-session_id
комбинация уникальна.
Я должен сделать HTML-таблицу (в PHP), который отобразил бы данные как это:
+----------+---------+---------+---------+
| |61 |62 |63 |
+----------+---------+---------+---------+
|901 |X | |X |
|902 | |X | |
|903 | | |X |
+----------+---------+---------+---------+
Следовательно, строки pilot_id
и столбцы session_id
. Когда a pilot_id
-session_id
комбинация имеет a present
значение 1, соответствующая ячейка должна быть проверена. (т.е. когда комбинация строки является нулем, или комбинация не существует в таблице MySQL, ничто не должно появляться в HTML-таблице),
Уф.
Какие-либо идеи?
Спасибо!
Я попробовал ответ, предложенный erisco, но я вполне смущен. (поле комментария является слишком небольшим для моего объяснения, следовательно этого обновления моего вопроса).
Это - фактические данные, с которыми я работаю:
+----------+-----------+---------+--------+
|status_id |session_id |pilot_id |present |
+----------+-----------+---------+--------+
|7 |65 |33 |1 |
|8 |66 |33 |1 |
|9 |65 |17 |0 |
|10 |66 |16 |1 |
+----------+-----------+---------+--------+
Я использую $rows = mysqli_fetch_array($result);
. Я подтвердил, что запрос возвращает правильные данные.
Однако, когда я использую ответ, предложенный ericso, я получаю на вид произвольные данные. Вот сгенерированная HTML-таблица:
+----------+---------+---------+---------+---------+
| |1 |3 |6 |7 |
+----------+---------+---------+---------+---------+
|1 |X | | | |
|3 | | | | |
|6 | | | | |
|7 | | | | |
+----------+---------+---------+---------+---------+
Кроме того, 'X' положение остается тот же irrelevantly present
значения.
Какие-либо идеи, почему это происходит?
Спасибо!
К счастью, вам нужен только один запрос. Предполагая, что $ rows - это формат ваших данных, извлеченных из базы данных:
<?php
$rows = array(
array(
'status_id' => 1,
'session_id' => 61,
'pilot_id' => 901,
'present' => 1,
),
array(
'status_id' => 2,
'session_id' => 63,
'pilot_id' => 901,
'present' => 1,
),
array(
'status_id' => 3,
'session_id' => 62,
'pilot_id' => 901,
'present' => 0,
),
array(
'status_id' => 4,
'session_id' => 62,
'pilot_id' => 902,
'present' => 1,
),
array(
'status_id' => 5,
'session_id' => 63,
'pilot_id' => 903,
'present' => 1,
)
);
$session_ids = array();
$pilot_ids = array();
$crosses = array();
foreach ($rows as $row) {
$session_ids[$row['session_id']] = $row['session_id'];
$pilot_ids[$row['pilot_id']] = $row['pilot_id'];
if ($row['present'] == 1) {
$cross_index = $row['session_id'].'.'.$row['pilot_id'];
$crosses[$cross_index] = $cross_index;
}
}
sort($session_ids);
sort($pilot_ids);
?>
<table>
<tr>
<th></th>
<?php foreach ($session_ids as $sess_id): ?>
<th><?php echo $sess_id; ?></th>
<?php endforeach; ?>
</tr>
<?php foreach ($pilot_ids as $pilot_id): ?>
<tr>
<th><?php echo $pilot_id; ?></th>
<?php foreach ($session_ids as $sess_id): ?>
<?php if (isset($crosses[$sess_id.'.'.$pilot_id])): ?>
<td>X</td>
<?php else: ?>
<td></td>
<?php endif; ?>
<?php endforeach; ?>
</tr>
<?php endforeach; ?>
</table>
Вы можете использовать такой алгоритм:
$sql = "SELECT DISTINCT session_id AS sid FROM pilot_session ORDER BY 1 ASC";
$rs = mysql_query($sql, $conn);
$sessions = array();
while(false !== ($r = mysql_fetch_array($rs))){
$sessions[] = $r['sid'];
}
$sql = "SELECT DISTINCT pilot_id AS pid FROM pilot_session ORDER BY 1 ASC";
$rs = mysql_query($sql, $conn);
$pilots = array();
while(false !== ($r = mysql_fetch_array($rs))){
$pilots[] = $r['pid'];
}
$pilot_presence = array();
$sql = "SELECT session_id, pilot_id, present FROM pilot_session";
$rs = mysql_query($sql, $conn);
while(false !== ($r = mysql_fetch_array($rs))){
$s_presence[$r['pilot_id']][$r['session_id']] = $r['present'];
}
echo "<table><tr><td> </td>";
foreach($sessions as $s){
echo "<td>$s</td>";
}
echo "</tr>";
foreach($pilots as $p){
echo "<tr><td>$p</td>";
foreach($sessions as $s){
$tp = '';
if(isset($s_presence[$p][$s])){
if($s_presence[$p][$s] == '1'){
$tp = 'X';
}
}
echo "<td>".$tp."</td>";
};
echo "</tr>";
}
echo "</table>";