1

我正在尝试连接表以防止过多的数据库查询,但我不喜欢数据返回的方式。

查询:

SELECT person.name, dog.dog_name FROM person JOIN dog ON person.id = dog.person_id

返回看起来像这样:

Array
(
[0] => Array
    (
        [name] => Jim
        [dog_name] => Wolf
    )

[1] => Array
    (
        [name] => Jim
        [dog_name] => Frisky
    )

[2] => Array
    (
        [name] => Tina
        [dog_name] => Pokedot
    )

[3] => Array
    (
        [name] => Tina
        [dog_name] => Spiky
    )
)

是否可以让查询返回如下内容:

Array
(
[0] => Array
    (
        [name] => Jim
        [dog_name] => array(Wolf, Frisky)
    )

[1] => Array
    (
        [name] => Tina
        [dog_name] => array(Pokedot, Spiky)
    )
)
4

1 回答 1

8

最接近的解决方案是:

SELECT person.name, GROUP_CONCAT(dog.dog_name) AS dog_names
FROM person JOIN dog ON person.id = dog.person_id
GROUP BY person.id

这将返回一个字符串,它是以逗号分隔的狗名列表,而不是 PHP 数组。您必须explode()在应用程序代码中使用该字符串。

请注意,GROUP_CONCAT() 的默认长度限制为 1024 个字符,由配置选项控制group_concat_max_len


我同意@KonstantinWeitz 的评论,让RDBMS 做它最擅长的事情是值得的,然后使用PHP 代码将结果后处理成你想要的格式。

例如,这是我将如何返回您描述的数组的方法:

$peoplesdogs = array();
$stmt = $pdo->query("SELECT person.name, dog.dog_name FROM person JOIN dog ON person.id = dog.person_id");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
  $peoplesdogs[$row["name"]]["name"] = $row["name"];
  $peoplesdogs[$row["name"]]["dog_name"][] = $row["dog_name"];
}
return array_values($peoplesdogs);
于 2013-07-01T20:26:14.223 回答