2009-08-07 46 views
0

我发现,当试图在许多表之间构建复杂的MySQL连接和组时,我通常会发生冲突,必须花费大量的“试错”时间来获得我想要的结果。构建复杂的MySQL连接和组的最佳方法?

我想知道其他人如何解决问题。你是否在分支结束时隔离了更小的数据块,并首先得到这些数据?或者,你是从你想要返回的东西开始的,只需要开始连接表格就可以了吗?

也想知道是否有任何关于解决问题的好书或网站。

回答

1

我没有在MySQL的,但我也经常写的极其复杂的SQL和这里的我如何对待它。

首先,没有任何东西可以完全理解你的数据库结构。

接下来我尝试将任务分解为块。

例如,假设我正在撰写一份关于会议细节(我工作的公司会议计划)的报告。我需要知道会议名称和销售代表,会议地点和日期,参加会议的人员和发言人信息。

首先我确定哪个表格将具有报表中每个字段的信息。现在我知道我必须加入到一起,但还不完全如此。

因此,我首先写一个查询来获得我想要的会议。这是报告其余部分的基础,所以我从那里开始。现在,报告的其余部分可以按任何顺序完成,但我更愿意先完成应该有一对一关系的部分,接下来我将添加连接和字段,这些关联和字段将使我关联所有的销售代表信息。

假设我只希望每个会议有一个代表(如果有多个代表,我只想要主代表),所以我检查以确保我仍然返回与刚刚会议信息时相同数量的记录。如果不是,我看看我的连接,并决定哪一个给我比我需要更多的记录。在这种情况下,它可能是地址表,因为我们正在为代表存储多个地址。然后我调整查询以获得唯一一个。这可能很简单(你可能有一个字段表示你想要的特定的唯一地址,所以只需要添加一个where条件),或者你可能需要做一些分组和聚合函数来得到你想要的。

然后我继续讨论下一个块(首先在所有块中工作,在本例中,应该有一个到中央数据的1-1关系shshp)。运行查询并在每次添加后检查数据。

最后,我将转向那些可能具有一对多关系并添加它们的记录。我再次运行查询并检查数据。例如,我可能会检查特定会议的原始数据,并确保我的查询返回的内容正是我期望看到的内容。

假设在这些加入的加入之一,我发现不同会议的数量已经下降。糟糕,那么我刚刚添加的其中一个表中没有数据,我需要将其更改为左连接。

另一次我可能会发现返回的记录太多。然后我看看我的where子句是否需要更多的过滤信息,或者如果我需要使用aggreagte函数来获取我需要的数据。有时我会暂时将其他字段添加到报告中,以查看是否可以查看导致重复数据的原因。这有助于我了解需要调整的内容。

真正的关键是慢慢地工作,理解你的数据模型并在添加每个新块后检查数据,以确保它按照你认为应该的方式返回结果。

有时,如果我要返回大量数据,我会暂时在查询中添加一个附加的where子句,以限制我可以轻松检查的几个项目。我也强烈建议使用order by,因为它可以帮助您查看是否获取重复的记录。

+0

感谢您分享您的方法。这很棒。 :) – Das123 2009-09-11 20:22:07

0

我自己没有使用过它们,所以无法评论它们的有效性,但也许基于GUI的查询生成器(如dbForgeCode Factory)可能有所帮助?

尽管使用维恩图思考MySQL连接并不一定能帮助SQL,但它们可以帮助查看您试图撤回的数据(请参阅Jeff Atwood's post)。

1

那么,打破你的MySQL查询的最佳方法是运行EXPLAIN命令以及查看Optimization with the EXPLAIN命令的MySQL文档。

MySQL提供了一些很好的免费GUI tools,MySQL查询浏览器是你需要使用的。

运行EXPLAIN命令时,这将打破MySQL如何解释您的查询并显示复杂性。解码输出可能需要一些时间,但这本身就是另一个问题。

至于一本好书,我会建议:High Performance MySQL: Optimization, Backups, Replication, and More