Pregunta

Tengo una base de datos con una lista de ubicaciones, por ejemplo:

C_ID   |   Name 

1      |   Italy
2      |   Germany
3      |   France
4      |   Spain

y en una tabla separada, una lista de personas que son de esos países,

P_ID  |  Name   |  C_ID

1     | John    | 1
2     | Mark    | 1
3     | Paul    | 2
4     | Pierre  | 3
5     | Alan    | 2

He tomado estos datos en una consulta SQL con una combinación ...

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

Lo que me proporciona:

Italy John
Italy Mark
Germany Paul
Germany Alan
France Pierre

Sin embargo, lo que estoy tratando de lograr es una lista desordenada, hecha eco por PHP. Con los nombres de personas agrupados por nombre de país . A diferencia del nombre del país que se repite. He intentado usar matrices, sin embargo, mi conocimiento de PHP / MySQL me está decepcionando ...

¿Fue útil?

Solución

Prueba:

$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] es el país, $ row [1] es el nombre de la persona. La función en el bucle while es clave aquí. Esto hace bastante. Básicamente, agrega una entrada a la matriz de resultados marcada por el nombre del país y agrega el nombre de la persona a la matriz que almacena allí.

Editar: Para ordenar como una 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>';
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top