MySQL在一个查询中从多个不同的表中选择数据
我有一个用户数据库,其中有一个名称,地址等的主表。然后,我为用户的孩子,宠物,培训课程和教育结果等有单独的表格。MySQL在一个查询中从多个不同的表中选择数据
此用户的详细信息可以全部显示在同一页面上,而我目前的做法是首先查询数据库中的用户主要详细信息。然后我单独查询其他表并使用循环显示此信息。
我真的只需要知道这是否是最好的方式来做到这一点,或者是否有一种方法来处理单个查询,并且有什么优势?
表的基本结构是:
+----------------+ +-----------------------+
| 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 |
+-----------------------+
这是一个基本的版本,并只显示用户和儿童桌。其他表与子表相似,因为它们引用用户表并为单个用户提供多个记录。
在此先感谢。
你可以在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。名字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端不一定更快,并且您会看到在后端代码中需要做多少额外的工作。我的建议是尝试一下,看看它如何影响你的表现。
我认为这是要走的路。我会试一试,看看它是如何影响性能的。 – Sean 2012-04-16 15:11:01
这里有一个很好的查询开始:
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-16 14:15:40
这的确很简单。我建议你先写下哪些列有问题,以及它们属于哪个表。然后写下你想要的最终结果表的输出结果。了解输入和输出后,您可以形成并编写一条SQL语句,以提供所需的输出。首先,您只需要正是你想要你写的语句之前,所以一切都按您所预期的 检查我的答案,让我知道如何去 – Pavan 2012-04-16 14:29:01