2009-08-07 84 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