MySQL / PHP: объединить результаты, такие как сноски из нескольких таблиц - PullRequest
0 голосов
/ 27 августа 2011

Я многому научился на этом форуме, и спасибо заранее.По сути, я пытаюсь сделать «сноски» для результатов запроса к базе данных из нескольких таблиц.В моей таблице есть «библиографическая ссылка» для каждого из нескольких биоматериалов, но я не могу объединить результаты таким образом, чтобы это было более читабельным.Я думаю, что мне нужно использовать многомерные массивы, но я думаю, что должен быть более элегантный способ.Часть кода MySQL в коде php:

    $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;


              }

И часть кода php "pretty printing":* но в идеале это будет:

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

, где числа - это ссылки href, отображаемые в виде текста (ссылка на документ PDF)Спасибо за любую помощь или руководство о том, что будет лучше в этом случае!

Ответы [ 2 ]

1 голос
/ 27 августа 2011

Вы должны добавить к вашему запросу функцию group_concat и group by group и заставить все работать в 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
1 голос
/ 27 августа 2011

Вам просто нужно правильно агрегировать ваши результаты в массив.Измените последние два цикла на:

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 />';
}

Я пропустил экранирование данных с помощью htmlspecialchars() для лучшей читаемости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...