Come faccio a ordinare il risultato di un join SQL per una singola colonna in PHP
Domanda
Ho un database con un elenco di posizioni, ad es .:
C_ID | Name
1 | Italy
2 | Germany
3 | France
4 | Spain
e in una tabella separata, un elenco di persone che provengono da quei paesi,
P_ID | Name | C_ID
1 | John | 1
2 | Mark | 1
3 | Paul | 2
4 | Pierre | 3
5 | Alan | 2
Ho preso questi dati in una query SQL con un join ...
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";
Che mi fornisce:
Italy John
Italy Mark
Germany Paul
Germany Alan
France Pierre
Tuttavia, ciò che sto cercando di ottenere è un elenco non ordinato, echeggiato da PHP. Con i nomi delle persone raggruppati per nome del paese . A differenza del nome del paese che si ripete. Ho provato ad usare array ma la mia conoscenza di PHP / MySQL mi sta deludendo ...
Soluzione
Prova:
$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]
è il paese, $ row [1]
è il nome della persona. La funzione nel ciclo while
è la chiave qui. Questo fa abbastanza. Fondamentalmente aggiunge una voce alla matrice dei risultati codificata dal nome del paese e aggiunge il nome della persona alla matrice in essa memorizzata.
Modifica: Per ordinare come un elenco:
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>';