我试图连接表以防止太多的数据库查询,但我不喜欢数据返回的方式.
查询:
SELECT person.name, dog.dog_name FROM person JOIN dog ON person.id = dog.person_id
Run Code Online (Sandbox Code Playgroud)
返回看起来像这样:
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
)
)
Run Code Online (Sandbox Code Playgroud)
是否可以让查询返回如下内容:
Array
(
[0] => Array
(
[name] => Jim
[dog_name] => array(Wolf, Frisky)
)
[1] => Array
(
[name] => Tina
[dog_name] => array(Pokedot, Spiky)
)
)
Run Code Online (Sandbox Code Playgroud)
最接近的解决方案是:
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
Run Code Online (Sandbox Code Playgroud)
这将返回一个字符串,该字符串是逗号分隔的狗名称列表,而不是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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
411 次 |
| 最近记录: |