MySQL在单个查询中从多个不同的表中选择数据

时间:2012-04-16 14:12:48

标签: mysql database database-table

我有一个用户数据库,我有一个名字,地址等的主表。然后,我为用户提供了单独的表格,包括儿童,宠物,培训课程和教育成果等。

此用户详细信息都可以显示在同一页面上,我目前的方式是首先查询数据库以获取用户的主要详细信息。然后我分别查询其他表并用循环显示这些信息。

我真的只需要知道这是否是最佳方式,或者是否有一种方法可以通过单个查询进行,并且是否有任何优势?

表格的基本结构是:

+----------------+    +-----------------------+
| 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  |
                      +-----------------------+

这是一个基本版本,仅显示用户和子表。其他表类似于子表,因为它们引用用户表并为单个用户提供多个记录。

提前致谢。

2 个答案:

答案 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端,它不一定更快,你可以看到你的后端代码需要做多少额外的工作。我的建议是尝试一下,看看它会如何影响你的表现。

相关问题