2010-04-14 25 views
6

He estado luchando durante un tiempo con esta; Trataré de explicarlo aquí de la manera más simple posible.Tabla de HTML único de varias tablas de MySQL

considerar esta tabla de 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  | 
+----------+-----------+---------+--------+ 

Tanto session_id y pilot_id son las claves externas que hacen referencia a una clave primaria en otra tabla. El mismo pilot_id se puede asociar con diferentes session_id, pero cada combinación de pilot_id - session_id es única.

Necesito hacer una tabla HTML (en PHP) que mostrar los datos como este:

+----------+---------+---------+---------+ 
|   |61  |62  |63  | 
+----------+---------+---------+---------+ 
|901  |X  |   |X  | 
|902  |   |X  |   | 
|903  |   |   |X  | 
+----------+---------+---------+---------+ 

Por lo tanto, las filas son pilot_id y columnas son session_id. Cuando una combinación pilot_id - session_id tiene un valor present de 1, se debe marcar la celda correspondiente. (es decir, cuando la combinación de filas es cero o la combinación no existe en la tabla MySQL, nada debe aparecer en la tabla HTML)

Phew.

¿Alguna idea?

Gracias!


He intentado la respuesta propuesto por Erisco, pero estoy bastante confundido. (el campo de comentarios es demasiado pequeño para mi explicación, de ahí esta actualización de mi pregunta).

Estos son los datos reales que estoy trabajando con:

+----------+-----------+---------+--------+ 
|status_id |session_id |pilot_id |present | 
+----------+-----------+---------+--------+ 
|7   |65   |33  |1  | 
|8   |66   |33  |1  | 
|9   |65   |17  |0  | 
|10  |66   |16  |1  | 
+----------+-----------+---------+--------+ 

utilizo $rows = mysqli_fetch_array($result);. Confirmé que la consulta está devolviendo los datos correctos.

Sin embargo, cuando uso la respuesta propuesta por ericso, obtengo datos aparentemente arbitrarios. Aquí está la tabla HTML generada:

+----------+---------+---------+---------+---------+ 
|   |1  |3  |6  |7  | 
+----------+---------+---------+---------+---------+ 
|1   |X  |   |   |   | 
|3   |   |   |   |   | 
|6   |   |   |   |   | 
|7   |   |   |   |   | 
+----------+---------+---------+---------+---------+ 

Además posición de la 'X' sigue siendo el mismo a cuento de present valores.

¿Alguna idea de por qué sucede esto?

Gracias!

+0

Si var_dump'd sus filas frente a los $ $ filas que tengo, lo que probablemente ver las diferencias. Intentaría usar '$ rows = mysqli_fetch_all ($ result, MYSQLI_ASSOC);' – erisco

+0

Ah, sí. Veo que algo está mal.Cuando utilizo mysqli_fetch_assoc consigo: array (4) { [ "status_id"] => string (1) "7" [ "pilot_id"] => string (2) "33" [ "session_id"] => string (2) "65" [ "presente"] => string (1) "1"} , que es sólo la primera fila ... ¿Por qué? De todas formas, $ filas = mysqli_fetch_all ($ resultado, MYSQLI_ASSOC) no funcionó, aunque ... (de lo que en Google, no tengo mysqlnd - que no puedo instalar en mi servidor compartido). Aquí está el error: Fatal error: Llamada a mysqli_fetch_all función no definida(). ¡Gracias! –

+0

que acaba de terminar de hacer esto: filas $ = array(); while ($ rawRow = mysqli_fetch_assoc ($ resultado)) { $ filas [] = $ rawRow; } –

Respuesta

3

Por suerte sólo necesita una consulta. Suponiendo $ filas es el formato de los datos retirados de la base de datos:

<?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> 
+0

1 ... y bien separados presentación de la lógica. –

+0

¡Gracias por tu ayuda! Sin embargo, estoy bastante confundido. He publicado una respuesta a continuación (el campo de comentarios es demasiado pequeño para mis explicaciones), alguna idea? –

0

Puede utilizar el algoritmo de esta manera:

$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>&nbsp</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>"; 
Cuestiones relacionadas