Результат SQL-запроса с левым соединением и результирующий массив с PHP - PullRequest
3 голосов
/ 27 марта 2012

У меня есть следующий запрос:

SELECT * FROM teams
LEFT JOIN participants
ON teams.teamNo = participants.teamNo
ORDER BY teams.teamNo ASC

Этот запрос, очевидно, получает все команды в таблице команд и там, где есть соответствующий участник в таблице участников, которая возвращается.Не каждая команда может назначить участников, но должна отображаться каждая команда.

Я хочу отобразить данные на той же странице, например, так (заметьте, что команда 2 не имеет текущих участников, но все еще отображается:

Team 1:    
 - Participant 1
 - Participant 2
 - Participant 3

Team 2:

Team 3:    
 - Participant 1
 - Participant 2

У меня есть следующий массив, возвращающийся из запроса SQL:

Array
(
[0] => Array
    (
        [TeamNo] => 1
        [ParticipantFirstNames] => Katie
        [ParticipantSurname] => Bloggs
    )

[1] => Array
    (
        [TeamNo] => 1
        [ParticipantFirstNames] => Jenny
        [ParticipantSurname] => Ruffles
    )

[2] => Array
    (
        [TeamNo] => 1
        [ParticipantFirstNames] => Hannah
        [ParticipantSurname] => Cox
    )

[3] => Array
    (
        [TeamNo] => 2
        [ParticipantFirstNames] => 
        [ParticipantSurname] => 
    )

[4] => Array
    (
        [TeamNo] => 3
        [ParticipantFirstNames] => Alex
        [ParticipantSurname] => Glover
    )

[5] => Array
    (
        [TeamNo] => 3
        [ParticipantFirstNames] => Karl
        [ParticipantSurname] => Lawrence
    )

Я считаю, что мне нужно преобразовать его в массив, как показано ниже, но я не уверен, как это сделать в PHP:

array(
array(  'TeamNo' => '1',
        'TeamParticipants' => array(
                            array(  'ParticipantFirstName' => 'Harry',
                                    'ParticipantSurname' => 'Bloggs'),
                            array(  'ParticipantFirstName' => 'James',
                                    'ParticipantSurname' => 'Car'))
                            )

array(  'TeamNo' => '2',
        'TeamParticipants' => array() )


array(  'TeamNo' => '3',
        'TeamParticipants' => array(
                            array(  'ParticipantFirstName' => 'Harry',
                                    'ParticipantSurname' => 'Bloggs'),
                            array(  'ParticipantFirstName' => 'James',
                                    'ParticipantSurname' => 'Car')
                                )

                            )
)

Я просто не могу разобраться с массивами, может кто-то помочь, или мне нужен другой запрос в первую очередь ??используя PHP.

Ответы [ 3 ]

2 голосов
/ 27 марта 2012

Это преобразует ваш текущий массив в тот, который вы хотите:

$newArray = array();
foreach ($resultArray as $record) {
    $currentTeam = $record('TeamNo');
    if (!array_key_exists($currentTeam, $newArray)) {
        $newArray[$currentTeam] = array('TeamNo' => $currentTeam, 'TeamParticipants => array());
    }
    if (!empty($record['ParticipantFirstName']) {
        $newArray[$currentTeam]['TeamParticipants'][] = array('ParticipantFirstName' => $record['ParticipantFirstName'], 'ParticipantLastName' => $record['ParticipantLastName']);
    }
}

Это в значительной степени непроверено, но оно должно предоставлять в основном то, что вы хотите. Единственное отличие состоит в том, что я использую ассоциативный массив снаружи, чтобы легко найти, какие номера команд уже были созданы.

Я не делаю никаких суждений о том, почему вы хотите преобразовать массив таким образом. Я предполагаю, что вы знаете лучше, почему вы хотите массив в этом формате. Это должно помочь вам получить его там.

0 голосов
/ 27 марта 2012

Что-то вроде этого должно сделать:

$q=mysql_query("your query");
while($r=mysql_fetch_assoc($q)) {
  $a["Team ".$r["teamNo"]][]=array("fname"=>$r["firstName"], "sname"=>$r["surname"]);
}

$a["Team ".$r["teamNo"]] создает - или ссылается на существующее - значение по ассоциативному индексу "Team N" массива $a.

$a["Team ".$r["teamNo"]][]говорит, что указанное значение является автоматически увеличивающимся массивом с индексами int (поэтому создается новый ключ int при каждом вызове).

Мы устанавливаем значение, соответствующее этому автоматически увеличенному индексу, в массив с 2 ключами / значениемпары: "fname" ссылаются на имя текущего участника и "sname" ссылаются на его / ее фамилию.Это дает структуру:

$a : array {
  "Team 1" : array {
    0 : array {
      "fname" > "Billy"
      "sname" > "The Kid"
    }
  }
  "Team 1" : array {
    1 : array {
      "fname" > "John"
      "sname" > "Dillinger"
    }
  }
  "Team 2" : array {
    0 : array {
      "fname" > "Melvin"
      "sname" > "Purvis"
    }
  }

  "Team 2" : array {
    1 : array {
      "fname" > "Eliot"
      "sname" > "Ness"
    }
  }
}

Используя PHP, вы получаете доступ к нему следующим образом:

$a["Team 1"][0]["fname"] //Billy
$a["Team 1"][1]["fname"] //John
$a["Team 1"][0]["sname"] //The Kid
$a["Team 2"][1]["sname"] //Ness

То есть с циклом для отображения, например:

foreach($a as $team=>$participants) {
  echo "<h1>$team</h1>";
  foreach($participants as $identity) { //no need for keys here, as they're semantically irrelevant
    echo $identity["fname"]." ".strtoupper($identity["sname"])."<br>";
  }
}

Это покажет

<h1>Team 1</h1>
Billy THE KID<br>
John DILLINGER<br>
<h1>Team 2</h1>
Melvin PURVIS<br>
Eliot NESS<br>

Надеюсь, это достаточно ясно для вас, чтобы лучше понять массивы.

0 голосов
/ 27 марта 2012

Вы пробовали mysql_fetch_assoc () или mysql_fetch_array ()?какую функцию вы используете при получении выходных данных

 $query = "SELECT * FROM teams
 LEFT JOIN participants
 ON teams.teamNo = participants.teamNo
 ORDER BY teams.teamNo ASC"

 $result = mysql_query($query);

 while($row = mysql_fetch_array($result)){
     echo $row[0];
     echo $row[1];
     //and so on, this will display the data starting by the index 0 which is the first field
 }
...