我有一个用户数据库,我有一个名字,地址等的主表。然后,我为用户提供了单独的表格,包括儿童,宠物,培训课程和教育成果等。
此用户详细信息都可以显示在同一页面上,我目前的方式是首先查询数据库以获取用户的主要详细信息。然后我分别查询其他表并用循环显示这些信息。
我真的只需要知道这是否是最佳方式,或者是否有一种方法可以通过单个查询进行,并且是否有任何优势?
表格的基本结构是:
+----------------+ +-----------------------+
| 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 |
+-----------------------+
这是一个基本版本,仅显示用户和子表。其他表类似于子表,因为它们引用用户表并为单个用户提供多个记录。
提前致谢。
答案 0 :(得分:0)
这是一个很好的查询:
SELECT * FROM Users RIGHT JOIN Children ON Users.ID = Children.UserRef
请注意,这将为您提供两个名为“Name”的值 - 这就是您需要使用别名的原因:
SELECT Users.Name as ParentName, Children.Name as ChildName FROM Users RIGHT JOIN Children ON Users.ID = Children.UserRef
您可以使用上述格式添加所需的任何其他字段。
至于是否更好使用它,每种方法都有其优点和缺点。当您使用更大,更高级的查询创建一个脚本时,您可以执行所需的操作(而不是许多较小的查询),您的脚本将运行得更快,因为而不是有1 +(父项数)查询进入服务器并返回,只会是一个查询。但是,组织不良的查询可能会在以后再次出现问题时导致调试问题,并且不记得为什么要这样做。
答案 1 :(得分: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端,它不一定更快,你可以看到你的后端代码需要做多少额外的工作。我的建议是尝试一下,看看它会如何影响你的表现。