MySQL / PHP: consolida resultados como notas al pie de varias tablas

He aprendido mucho de este foro y gracias de antemano. Básicamente, estoy tratando de hacer "notas al pie" para los resultados de una consulta de base de datos de varias tablas. Mi tabla tiene la "referencia bibliográfica" para cada uno de varios materiales biológicos, pero no puedo consolidar los resultados de una manera que sea más legible. Creo que necesito usar matrices multidimensionales, pero creo que debe haber una forma más elegante. La porción de MySQL en el código php es:

    $queryFromAgentBW = "SELECT DISTINCT reports.ID, reports.link, agent_names.ID, agent_names.Name, agent.BW_Actor_List, agent.Common_Name, agent.Reference, actor_list.ID

                         FROM agent_names, agent

                         JOIN actor_list ON(agent.BW_Actor_List = actor_list.ID) 

                         JOIN reports ON(agent.Reference = reports.ID)

                         WHERE  agent_names.ID = agent.Agent_Name AND BW_Actor_List = '".mysql_real_escape_string($a)."'";


 $resultFromAgentBW = mysql_query($queryFromAgentBW);

      //check result;  show error for debugging
      if (!$resultFromAgentBW)
      {
   $message = 'Invalid query:'.mysql_error()."\n";
   $message .= 'Whole query:'.$queryFromAgentBW;
  die($message);
      } 
     while ($rowBW = mysql_fetch_assoc($resultFromAgentBW))  
     {

//  Need to get all this in an array and then print out later so agents 
          are listed only once with  all of the corresponding reference numbers
$bwArray[] = $rowBW;


              }

Y la parte del código de "impresión bonita" de php es:

    foreach ($bwArray as $bw) 
    {     
echo "Name: {$bw['Name']}<br />"
. "Ref: {$bw['Reference']}<br />"
. "Link: {$bw['link']}<br /><br />";
     }

El resultado es ahora:

    Name: Abrin toxin
    Ref: 1
    Link: C:\wamp\www\References\Abrin\AbrinandRicin_Patocka.pdf

    Name: Abrin toxin
    Ref: 6
    Link: C:\wamp\www\References\Abrin\TheEmergencyResponseSafetyandHealthDatabase_           Biotoxin_ ABRIN.pdf

    Name: Adenovirus
    Ref: 9
    Link: C:\wamp\www\References\Adenovirus\Adenovirus (Serotypes 40 & 41)_PHAC .pdf


   Name: Adenovirus
   Ref: 13
   Link: C:\wamp\www\References\Adenovirus\AdenovirusSerotype31InfectioninaNewbornGirlandReviewoftheLiterature.pdf

pero idealmente sería:

    Abrin Toxin   [1, 6]
    Adenovirus    [9, 13]

donde los números son enlaces href que ahora se muestran como texto (referencia de documento PDF). ¡Gracias por cualquier ayuda u orientación sobre lo que sería mejor en este caso!

preguntado el 27 de agosto de 11 a las 18:08

esto no es un foro, sabes -

Ashok aprende OOP y luego cómo implementar DAO. Luego, cómo separar la vista de la lógica. Eso significa en su caso: no haga ambas cosas en el mismo archivo: trabajar con la base de datos Y entrelazar html. -

@ Coronel Shrapnel- ¡Vaya! Disculpas, debería haber dicho sitio de preguntas y respuestas. @ Flavius ​​- Sí, mejorar mi comprensión de OOP y DAO mejorará mis habilidades generales y quizás optimizará el código, pero la simple sugerencia / guía de Andrej L (que vino ANTES de su comentario) es todo lo que necesitaba y realmente responde a la pregunta. Además, su comentario sobre wamp muestra una mentalidad provinciana o peor ignorancia, cuando tiene poco contexto sobre por qué se eligió esto específicamente, o los antecedentes detrás de mi proyecto. -

2 Respuestas

Solo necesita agregar correctamente sus resultados en una matriz. Cambie los dos últimos bucles a:

while ($rowBW = mysql_fetch_assoc($resultFromAgentBW)) {
    $bwArray[$rowBW['Name']][] = $rowBW;
}
foreach ($bwArray as $name => $refs) {
    echo 'Name: ' . $name . ' [';
    for ($i = 0; $i < count($refs); $i++) {
        echo ($i > 0 ? ' ' : '') . '<a href="' . $ref['link'] . '">' . $ref['Reference'] . '</a>';
    }
    echo ']<br />';
}

Omití los datos que se escapaban con htmlspecialchars() para una mejor legibilidad.

Respondido 27 ago 11, 22:08

Gracias, esto me ayudó a obtener las referencias para que también se vinculen correctamente según lo necesitaba después de incorporar la declaración SELECT actualizada de Andrej. - Ashok

Deberías agregar group_concat función y agrupar por cláusula a su consulta y hacer que todo funcione en mysql

SELECT group_concat(agent.Reference SEPARATOR ','), agent_names.ID, agent_names.Name

                     FROM agent_names, agent

                     JOIN actor_list ON(agent.BW_Actor_List = actor_list.ID) 

                     JOIN reports ON(agent.Reference = reports.ID)

                     WHERE  agent_names.ID = agent.Agent_Name AND BW_Actor_List =  '".mysql_real_escape_string($a)."'
GROUP BY agent_names.ID

Respondido 27 ago 11, 22:08

Esto es exactamente lo que necesitaba. Tienes razón, es más limpio y rápido trabajar en mysql. - Ashok

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.