这是一个“理论”问题。
我无法定义问题,请耐心等待。
当数据库中有多个相关表时,例如一个包含“用户”的表和一个包含“电话”的表
“phones”和“users”都有一个名为“user_id”的列
select user_id,name,phone from users left outer join phones on phones.user_id = users.user_id;
查询将为我提供所有用户的行,无论他们是否有电话。
如果用户有多个电话,他的姓名将按预期分两行返回。
columns=>|user_id|name|phone|
row0 = > | 0 |fred|NULL|
row1 = > | 1 |paul|tlf1|
row2 = > | 1 |paul|tlf2|
上述案例中的名称“paul”是必要的重复项,但在 RDMS 看来根本不是重复项! 然后它将由一些服务器端脚本语言处理,例如 php。
这些“必要的重复项”在实际网站或应用程序中实际上是如何处理的? 例如,该行如何“映射”到一些可用的对象模型中。
附注如果您决定发布示例,请尽可能发布用于 php、mysql、sqlite 的示例。
编辑:
感谢您提供答案,每个答案都以不同的方式解释了问题,因此以自己的方式不同且正确。
我得出的结论是,如果往返行程很昂贵,这将是 Jakob Nilsson-Ehle 解决方案的最佳方式,该解决方案适合理论问题。
如果往返很便宜,我会按照 9000 的建议分别选择手机和用户,如果我需要为每个用户显示一部手机,我会给手机一个主列并将其与用户合并选择像 Ollie Jones 正确建议的那样。
尽管对于现实生活中的应用,我使用的是 9000 的答案,但我认为对于这个不切实际的问题,Jakob Nilsson-Ehle 的解决方案是最合适的。
最佳答案
在这种情况下,在 PHP 中我可能会做的事情是在 PHP 数组中使用 userId,然后使用它来持续更新用户
一个非常简单的例子是
$result = mysql_query('select user_id,name,phone from users left outer join phones on phones.user_id = users.user_id;'); $users = Array(); while($row = mysql_fetch_assoc($result)) { $uid =$row['user_id']; if(!array_key_exists($uid, $users)) { $users[$uid] = Array('name' => $row['name'], 'phones' => Array()); } $users[$uid]['phones'][] = $row['phone']; }
当然,根据您的编程风格和用户数据的复杂性,您可以定义一个 User 类或其他东西并填充数据,但这基本上是我会做的。
关于php - 如何使用 PHP 处理从 SQL 查询返回的树结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4851062/