Como posso tipo o resultado de uma junção SQL por uma única coluna em PHP
Pergunta
Eu tenho um banco de dados com uma lista de locais v.g.:.
C_ID | Name
1 | Italy
2 | Germany
3 | France
4 | Spain
e em uma tabela separada, uma lista de pessoas que estão a partir desses países,
P_ID | Name | C_ID
1 | John | 1
2 | Mark | 1
3 | Paul | 2
4 | Pierre | 3
5 | Alan | 2
Eu peguei esses dados em uma consulta SQL com uma junção ...
SELECT locations.name as locaname, people.name as peoplename
FROM locations
INNER JOIN people
ON locations.c_id=people.c_id
ORDER BY locations.name";
O que me fornece com:
Italy John
Italy Mark
Germany Paul
Germany Alan
France Pierre
No entanto, o que eu estou tentando alcançar é uma lista não ordenada, ecoou pelo PHP. Com os nomes pessoas agrupados pelo nome do país . Ao contrário do nome do país a ser repetido. Eu tentei usar matrizes no entanto o meu conhecimento de PHP / MySQL está me deixando para baixo ...
Solução
Tente:
$sql = <<<END
SELECT locations.name as locaname, people.name as peoplename
FROM locations
INNER JOIN people
ON locations.c_id=people.c_id
ORDER BY locations.name"
END;
$query = mysql_query($query) or die($sql . ' - ' . mysql_error());
$result = array();
while ($row = mysql_fetch_array($query)) {
$result[$row[0]][] = $row[1];
}
print_r($result);
$row[0]
é o país, $row[1]
é o nome da pessoa. A função no circuito while
é a chave aqui. Isso faz muito. Ele basicamente adiciona uma entrada para a matriz resultado digitado pelo nome do país e acrescenta o nome da pessoa para a matriz que armazena lá.
Editar: Para modo como uma lista:
echo '<ul>';
foreach ($result as $country => $persons) {
echo "<li>$country\n<ul>\n";
foreach ($persons as $person) {
echo "<li>$person</li>\n";
}
echo "</ul></li>\n";
}
echo '</ul>';