0

我有一个用户数据库,其中有一个包含姓名、地址等的主表。然后,我为用户的孩子、宠物、培训课程和教育结果等设置了单独的表。

这个用户的详细信息都可以显示在同一页面上,我目前的做法是首先在数据库中查询用户的主要详细信息。然后我单独查询其他表并用循环显示这些信息。

我真的只需要知道这是否是最好的方法,或者是否有一种方法可以通过单个查询来完成,是否有任何优势?

表的基本结构是:

+----------------+    +-----------------------+
| Users          |    | Children              |
+----------------+    +-----------------------+
|ID |Name |Age   |    |ID |UserRef |Name |Age |
+----------------+    +-----------------------+
|1  |Jim  |53    |    |1  |1       |Joe  |11  |
|2  |Karl |37    |    |2  |1       |Jane |9   |
+----------------+    |3  |2       |Amy  |15  |
                      +-----------------------+

这是一个基本版本,只显示 user 和 children 表。其他表与子表相似,因为它们引用用户表并为单个用户提供多条记录。

提前致谢。

4

2 回答 2

0

您可以对 users.id = children.userref 上的表进行简单的 LEFT JOIN。但是,由于它是一对多的关系,您需要使用一些 GROUP BY 魔法:

  SELECT users.*, GROUP_CONCAT( children.id ORDER BY children.id ASC ) AS childrens_ids, GROUP_CONCAT( children.name ORDER BY children.id ASC ) AS childrens_names, GROUP_CONCAT( children.age ORDER BY children.id ASC ) AS childrens_ages FROM users LEFT JOIN children ON users.id = children.userref GROUP BY children.userref

然后,您必须使用代码来解析/分解孩子的 ID、姓名和年龄。尽管如此,这并不一定是你应该做的事情。在 MySQL 端它不一定更快,你会看到你在后端代码中需要做多少额外的工作。我的建议是尝试一下,看看它如何影响你的表现。

于 2012-04-16T14:26:56.167 回答
0

这是一个很好的查询:

SELECT * FROM Users RIGHT JOIN Children ON Users.ID = Children.UserRef

请注意,这将为您提供两个名为“名称”的值 - 这就是您需要使用别名的原因:

SELECT Users.Name as ParentName, Children.Name as ChildName FROM Users RIGHT JOIN Children ON Users.ID = Children.UserRef

您可以使用上述格式添加您需要的任何其他字段。

至于使用这个是否更好,每种方法都有其优点和缺点。当您使用更大、更高级的查询来执行您想要的操作(与许多较小的查询相反)创建脚本时,您的脚本将运行得更快,因为不是有 1 +(父级数量)查询往返于服务器,而是只会是一个查询。但是,组织不善的查询可能会在您稍后返回时导致调试问题,并且不记得为什么要按照您的方式进行操作。

于 2012-04-16T14:17:19.107 回答