2011-06-10 62 views
0

我有兩個表類似於數據庫:許多SQL查詢VS 1個複雜查詢

table1 
------ 
Id : long, auto increment 
Title : string(50) 
ParentId : long 

table2 
------ 
Id : long, auto increment 
FirstName : string(20) 
LastName : string(30) 
Zip : string(5) 

table2table1一個一對多的關係,其中包括許多零。

我也有以下查詢(即正常工作,所以忽略錯別字的等等,這是一個例子):

SELECT t1.Id AS tid, t1.Title, t2.Id AS oid, t2.FirstName, t2.LastName 
    FROM table t1 
    INNER JOIN table2 t2 ON t1.ParentId = t2.Id 
    WHERE t2.Id IN 
     (SELECT Id FROM table2 
     WHERE Zip IN ('zip1', 'zip2', 'etc')) 
    ORDER BY t2.Id DESC 

的查詢在屬於一個人在table2table1的所有項目,該人在哪一個列出的郵政編碼中。

我現在的問題是:我想在列出的郵政編碼中顯示所有用戶(其項目,如果可用),而不僅僅是帶有項目的郵件。

所以,我在想,我應該只是做一些簡單的有很多疑問,比如:

SELECT Id AS oid, FirstName, LastName FROM table2 WHERE Zip in ('zip1', 'zip2', 'etc') 
foreach(result) { 
    SELECT Id AS tid, Title FROM table2 WHERE ParentId = oid 
} 

或者我應該拿出更詳盡的單個SQL語句?如果是這樣,我可以得到一些幫助嗎?謝謝!

+0

重複? http://stackoverflow.com/questions/684989/one-complex-query-vs-multiple-simple-queries – JochenJung 2011-06-10 14:18:52

+0

我不同意,這取決於答案,因爲我正在尋找建設我的查詢的具體建議。 – steveo225 2011-06-10 14:20:37

回答

1

我同意(並已投票)@Lee D和@Bueller。但是,我通常主張使用左外連接,因爲我覺得更容易概念化他們正在發生的事情,特別是當您加入三張或更多表時。你知道你在最終結果集要

開始:考慮它像這樣

FROM table2 t2 

,然後在「可選」的數據添加。

FROM table2 t2 
left outer join table1 t1 
    on t1.ParentId = t2.Id 

無論是否找到匹配項,無論從table2中選擇什麼都將始終顯示。

+0

我實際上採用了這種方法,因爲它能夠滿足我需要的功能,而且,切換到正確的連接以更簡單的方式爲我提供了我在帖子中的內容。現在我可以選擇在兩者之間切換。謝謝 – steveo225 2011-06-10 15:09:59

0

你應該想出更詳細的單個SQL語句,然後用你最喜歡的編程語言處理結果。

+0

關於這個精心製作的SQL語句的任何建議?我原來的那個從'table1'工作,在那裏新的需要'table2'工作。但我不知道如何連接它們。 – steveo225 2011-06-10 14:22:48

2

如果我理解正確,將INNER JOIN更改爲RIGHT JOIN應該返回所有用戶,無論他們是否有項目,項目列對於那些沒有的項目都是空的。

2

研究右連接和分組依據。這將最有可能讓你查詢你以後。

0

如果我理解正確的話,我認爲你正在尋找這樣的事情

SELECT t1.Id AS tid, t1.Title, t2.Id AS oid, t2.FirstName, t2.LastName 
    FROM table t1 
    RIGHT OUTER JOIN table2 t2 ON t1.ParentId = t2.Id AND Zip IN ('zip1', 'zip2', 'etc')) 
    ORDER BY t2.Id DESC 

你可以有多個條件您JOIN和右外會給你所有的行表2中,即使他們不匹配表1

1

在一般情況下,你應該更喜歡「多查詢」的方式,如果(且僅當)

  • 它可以讓你在總
  • 簡單的代碼足夠快(你應該通過測試找出)

在這種情況下,我懷疑,這兩種情況可能不是適用。

+0

+1同意,但我想我應該謹慎對待這個查詢。 – steveo225 2011-06-10 15:01:57

0

您所描述的內容稱爲N + 1 query。您有1個初始查詢返回N個結果,然後1個查詢您的每個N個結果。如果N很小,性能差異可能不明顯 - 但隨着N的增長,性能將會越來越大。