2012-04-16 95 views
0

我有一个用户数据库,其中有一个名称,地址等的主表。然后,我为用户的孩子,宠物,培训课程和教育结果等有单独的表格。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 | 
         +-----------------------+ 

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

在此先感谢。

+0

更清楚你的问题,分享你想要的结果。 – 2012-04-16 14:15:40

+0

这的确很简单。我建议你先写下哪些列有问题,以及它们属于哪个表。然后写下你想要的最终结果表的输出结果。了解输入和输出后,您可以形成并编写一条SQL语句,以提供所需的输出。首先,您只需要正是你想要你写的语句之前,所以一切都按您所预期的 检查我的答案,让我知道如何去 – Pavan 2012-04-16 14:29:01

回答

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

+0

我认为这是要走的路。我会试一试,看看它是如何影响性能的。 – Sean 2012-04-16 15:11:01

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 +(父数)查询发送到服务器并返回,那里只会是一个查询。然而,组织不好的查询可能会在以后回到调试时遇到麻烦,并且不记得为什么按照您的方式进行调试。

+0

任何保健佳品,为什么这是downvoted SQL查询做什么知道吗?我认为这是一个很好的回应,他涵盖了所有的基础。 – tcole 2012-04-16 14:22:52

+0

另一个用户有一个简短的评论得到了其下投票,所以我怀疑这是报应。感谢您的支持。 – Tim 2012-04-16 14:24:05

相关问题