2008-10-20 5 views
1

J'ai des données de MySQL montrant toutes les organisations d'un client, avec tous les détails de l'emploi dans chaque organisation. Je veux à la liste chaque nom de l'organisation une seule fois dire dans une seule cellule (durée de ligne) et tous les employés de cette organisation contre ce nom comme:Comment est-ce que j'affiche des données de mysql dans la rangée en utilisant PHP?

Org1  Emp1 Name, Emp1 Phone, Emp1 Address 
     Emp2 Name, Emp2 Phone, Emp2 Address 


Org2  Emp1 Name, Emp1 Phone, Emp1 Address 
     Emp2 Name, Emp2 Phone, Emp2 Address 

Comment afficher ces données car le nombre de employess pour chaque organisation n'est pas connu à l'avance, donc je ne parle pas de la valeur de rowspan. De même, comment puis-je commencer une rangée pour une autre organisation? Dois-je écrire deux requêtes?

Merci beaucoup.

Répondre

4

Classique.

Solution de contournement: affichez uniquement le nom si différent du précédent. Vous ne pouvez même pas vous occuper du rowspan (vous gardez une cellule vide).

$currentOrg = ''; 
while ($row = mysql_fetch_object($query)) { 
    if ($row->org != $currentOrg) { 
     echo "$row->org". 
    } 
    $currentorg = $row->org; 
} 

Pas le plus beau mais si simple.

4
// Get the data 
$data = mysql_query('SELECT org, emp_name, emp_phone, emp_address FROM x'); 

// Store it all in a 2D array, keyed by org 
$rows = array(); 
while ($row = mysql_fetch_assoc($data)) 
{ 
    // Initialise each org to an empty array (not really needed in PHP but I prefer it) 
    if (empty($rows[$row['org']])) 
     $rows[$row['org']] = array(); 

    $rows[$row['org']][] = $row; 
} 

// Print it out 
foreach ($rows as $org => $employees) 
{ 
    print('<tr><td rowspan="' . count($employees) . '">' . htmlentities($org) . '</td>'); 

    foreach ($employees as $i => $employee) 
    { 
     // If $i == 0, we've already printed the <tr> before the loop 
     if ($i) 
      print('<tr>'); 

     print('<td>......</td></tr>'); 
    } 
} 
+0

J'ai voté votre réponse pour être la seule personne à ce jour à utiliser htmlentities() pour échapper à la sortie. J'utiliserais probablement sprintf() au lieu de concaténation ici, cependant. –

0

Pour faire une rowspan correcte, vous devez connaître le numéro à l'avance.

Cela vous laisse avec:

  • itérer le résultat de la requête deux fois, en comptant les valeurs jusqu'à ce qu'ils changent
  • demander au serveur de base de données pour le compte

Personnellement, j'aller avec la méthode numéro deux. Les serveurs DB sont très efficaces avec le comptage des lignes, cela sera probablement beaucoup plus rapide quand il y a beaucoup de lignes à afficher.

+0

Je ne recommanderais pas la deuxième méthode si vous utilisez le moteur INNODB. – Gaurav

+1

Prendre soin d'expliquer pourquoi? – Tomalak

0

Il pourrait être plus facile (mais moins efficace) de faire une requête pour chaque organisation (plus une requête pour trouver combien d'organisations il y a vraisemblablement).

Une meilleure façon de le faire serait de faire une boucle dans le tableau au préalable. Par exemple:

$sql = $mysqli->query('SELECT * FROM `organisation_members` ORDER BY `organisation` DESC'); 

if (!$sql || $sql->num_rows) { 
    // No data 
} else { 
    $data = array(); 
    while ($row = $sql->fetch_assoc()) {} 
     if (!array_key_exists($row['organisation'], $data)) { 
      $data[$row['organisation']] = array(); 
     } 
     $data[$row['organisation']][]['name'] = $row['name']; 
     // ... 
    } 
    $sql->close(); 
    echo '<table>'; 
    foreach ($data as $org => $people) { 
     $people_in_org = count($data[$org]) - 1; 
     $counter = 0; 

     echo '<tr>'; 
     echo '<td rowspan="' . $people_in_org + 1 . '">' . $org . '</td>'; 

     while ($counter < $people_in_org) { 
      if (counter > 0) { 
       echo '<tr>'; 
      } 
      echo '<td>' . $people[$counter]['name'] . '</td>'; 
      // etc 
      echo '</tr>'; 
     } 
    } 
    echo '</table>'; 
} 
0

Pour économiser de la mémoire, vous pouvez itérer sur l'ensemble de résultats alors que org est la même mise en mémoire tampon les lignes, lorsque des modifications organisationnelles, imprimez le lot en cours et commencer à tamponner le lot suivant.

0

Cela ne va pas vous aider avec le rowspan, mais regardez dans le modificateur WITH ROLLUP. Il renvoie les données dans un format similaire à ce que vous voulez.

0

Qu'en est-il en utilisant le paquet HTML_Table de poire comme dans l'exemple suivant, à i aussi comme la version ROLLUP de Jrgns

<?php 

    require_once "HTML/Table.php"; 




    $table = new HTML_Table(array('border'=>'1')); 
    $bo=array(
     array('6','a2','a3','a4'), 
     array('1','b2','b3','b4'), 
     array('1','c2','c3','c4') , 
     array('2','c2','c3','c4') , 
     array('2','c2','c3','c4') , 
     array('4','c2','c3','c4')); 

    foreach ($bo as $r => $borow) 
     $table->addRow($borow); 

    $rsFirst=0; 
    $rsLen=0; 
    foreach ($bo as $r => $borow) { 
     if ($r!=0 and $borow[0]!=$prevrow[0]) { 
      //jump in values 
      $table->setCellAttributes ($rsFirst,0, array('rowspan'=>$rsLen)); 
      $rsFirst=$r; 
      $rsLen=0; 
     } 
     $prevrow=$borow; 
     $rsLen++; 
     if ($r==sizeof($bo) - 1) { 
      $table->setCellAttributes ($rsFirst,0, array('rowspan'=>$rsLen)); 
     } 
    } 


    echo $table->toHTML(); 

    ?> 

Servas, Boërl

Questions connexes