2010-02-10 2 views
0

J'utilise une instruction JOIN MySQL INNER qui renvoie des résultats différents pour un enregistrement distinct dans le tableau principal du joint, semblable à How to Join Multiple Joins yet return Distinct Values Ma requête estPHP + MySQL instruction de jointure organiser plusieurs valeurs comme rangée dans le réseau de mysql_fetch

SELECT cl.*, dep.dept_name 
FROM epapers.clientelle cl 
INNER JOIN epapers.dept_staff_users depu 
ON depu.user_id=cl.user_id 
INNER JOIN epapers.dept dep 
ON dep.dept_id=depu.dept_id 
group by cl.user_id 
ORDER BY cl.user_name ASC, 

Je voudrais afficher ci-dessus dans un tableau ci-dessous

echo "<tr bgcolor='#CCCCCC'> 
<td >$num</td><td >".$row[user_id]."</td><td>".$row[user_name]."</td> 
<td >".$row[fname]."</td><td >".$row[lname]."</td> 
<td >".$row[dept_name]."</td> 
<td >".$row[dept_name]."</td> 
<td >".$row[dept_name]."</td> 
<td >".$row[email]."</td>"; 
$TrID = "$row[user_id]"; 
echo "<td >"; 
echo '<form name="activate" action="activate_acc.php" method="POST" ;">'; 
echo "<input type='hidden' name='TrID' value='$TrID'>";  
echo "<input type='checkbox' name='active' value='$row[active]'>"; 
echo '<input type="submit" name="Submit" value="Delete">'; 
echo '</form>'; 
echo "</td >"; 
... 

Notez les départements peuvent être jusqu'à 3 départements. Comment retourner les résultats de la requête mysql dans une seule ligne pour les départements?

Répondre

3

Si vous utilisez MySQL, vous pouvez utiliser GROUP_CONCAT mais vous devrez faire un peu de post-traitement et c'est un peu moche.

SELECT cl.*, GROUP_CONCAT(DISTINCT dep.dept_name SEPARATOR '|') as dept_name 
FROM epapers.clientelle cl 
INNER JOIN epapers.dept_staff_users depu 
ON depu.user_id=cl.user_id 
INNER JOIN epapers.dept dep 
ON dep.dept_id=depu.dept_id 
group by cl.user_id 
ORDER BY cl.user_name ASC 



foreach(.... 
    $departments = explode('|', $row['dept_name']); 
... 
    if(isset($departments[0])) { 
     echo "<td>{$departments[0]}</td>"; 
    } else { 
     echo "<td></td>"; 
    } 
    // same check 
    echo "<td>{$departments[1]}</td>"; 
    // same check 
    echo "<td>{$departments[2]}</td>"; 

Il est un peu débanalisation lors de l'exécution ...

+0

Cela fonctionne, mais comme j'utilisais 'while ($ row = mysql_fetch_array ($ result))' je devais utilisez ceci: '.... echo " num $ " $ row [user_id] "" $ row [USER_NAME] « .... ". $ Row [fname]." ". $ Row [lname]." "; $ departments = explode ('|', $ row ['dept_name']); if (isset ($ departments [0])) { echo " {$ départements [0]}"; } else { echo ""; } .... ' –

0

bien la façon dont vous pouvez le faire avec une requête MySQL est de se joindre à la table pour chacun des trois départements, comme celui-ci: sélectionnez a.dept_id comme dept_1 b.dept_id comme dept_2 etc et rejoindre la même table avec différent pour chaque ID de service. De cette façon, le processeur est très intensif. Il serait beaucoup plus rapide d'obtenir les données de la façon dont vous avez écrit votre requête, puis de traiter les données avec une fonction avant de l'utiliser. voici un exemple simple de la façon dont je le ferais:

function prep_data($mysql_result) 
{  
    $results = array(); 
    $work = array(); 
    while ($row = mysql_fetch_assoc($mysql_result)) 
    { 
     if ($work['user_id'] == $row['user_id']) 
     { 
      // just add dept data to dept array 
      $dept[] = $row['dept_id']; 
     } 
     else 
     { 
      // data changed    
      if (isset($work['user_id'])) 
      { 
       // assign dept array to data array 
       $work['dept_id'] = $dept; 
       // add work array to results collection 
       array_push($results, $work);     
       // start working with the new user_id 
       $work = $row; 
       $dept = array($row['dept_id']); 
       continue;     
      } 
      else 
      { 
       // this is first pass. grab the row data and start the dept[] array; 
       $work = $row; 
       $dept = array($row['dept_id']); 
       continue; 
      } 
     } 
    } 
    $work['dept_id'] = $dept; 
    array_push($results, $work); 
    return($results); 
} 

// bonne chance

+0

J'ai décidé d'utiliser la réponse de meouw car elle utilise la même requête que celle que j'utilise et elle est plus facile à expliquer à mon client. –

Questions connexes