php - 如何使用 PHP 处理从 SQL 查询返回的树结构?

标签 php mysql sqlite

这是一个“理论”问题。

我无法定义问题,请耐心等待。

当数据库中有多个相关表时,例如一个包含“用户”的表和一个包含“电话”的表

“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/

相关文章:

php - 以下代码出了什么问题?

php - 将 html 表中的内容存储到 mysql 数据库中

php - 为什么 (If false return "true") ... 返回 true?

mysql - 往返 INTO OUTFILE、Excel 编辑和 LOAD DATA INFILE 而不会损坏

android - sqlite3按最大值查询并按第二个因素过滤

node.js - Sequelize : findAll is not a function

javascript - 使用 JavaScript 过滤 HTML 表格 - textContent 错误

javascript - 将 JavaScript 值传递给 PHP 或其他 PHP 类 (codeigniter)

MySQL:根据列值限制接收到的结果数量 |组合查询

android - 如何从 Android 中的帮助类初始化一次 sqlite 数据库