2014-01-23 94 views
1

我們在的MySQL數據庫三個表 -SELECT查詢基於多個表

  1. 公司
  2. 員工
  3. 地址

公司擁有員工。員工有地址。 [注意他們可以有多個地址]

請看看下面的圖片爲結構

DB Structure

的總體思路,我們這裏有兩個條件 -

1.Get所有公司的員工至少有一個地址列在地址表中。

實例查詢結果應包含下列公司 -

微軟,谷歌,IBM


2.註冊所有的公司,其員工有沒有在地址表中列出的地址。

實例查詢結果應包含下列公司 -

雅虎

目前我們已經寫了這個查詢,這似乎是在爲這個特定條件 -

SELECT 
    company_id, 
    companies.company_name, 
FROM companies 
    LEFT OUTER JOIN employees ON employees.company_id = companies.company_id 
    LEFT OUTER JOIN addresses ON address.employee_id = employees.employee_id AND address_id IS NOT NULL 
WHERE address_id IS NULL GROUP BY companies.company_id; 

有使用單個查詢將這些結果提取到數據庫而不使用Stored Pro cedures?它應該向結果集(0或1)添加一列,具體取決於公司員工是否列有地址。

+2

Ahem。你給我們一個似乎正在工作的查詢,然後你問怎麼做? – Alexander

+0

存儲過程?你爲什麼需要這個? – hashbrown

+0

[解決方案](http://sqlfiddle.com/#!2/1c264/9)。按公司分組並檢查相關地址的計數是否大於0. –

回答

2

1.獲取其員工至少有一個地址列在地址表中的所有公司。

2.獲取其地址表中列出的員工沒有地址的所有公司。

是否有一種方法可以在不使用存儲過程的情況下使用單個查詢將數據提取到數據庫?

試試這個:

SELECT * FROM companies 

更新答案:

Select c.[company_id],c.[company_name], CASE WHEN count(a.address_id)>0 THEN 1 ELSE 0 END as [flag] from Company c 
left join Employee e on e.[company_id] = c.[company_id] 
left join Address a on a.[employee_id] = e.[employee_id] 
group by c.[ID],c.[company_name] 

給我的結果是:

ID NAME FLAG 
2 Google 1 
3 IBM 1 
1 Microsoft 1 
4 Yahoo 0 

sqlfiddle: http://sqlfiddle.com/#!6/4163a/3

更新:抱歉,MSSQL的sqlfiddle。這是fo mysql: http://sqlfiddle.com/#!2/18d09/1

+0

大聲笑,對。有一刻我想寫這個,太... – Alexander

+0

我已經更新了這個問題。 –

+0

@AbijeetPatro檢查更新的答案 – BaBL86

0

您可以使用'UNION'將兩個或多個查詢連接到單個查詢中。

Btw。從你的情況看來,你實際上想要所有的公司。

2

我只是將另一列添加到您現有的查詢並刪除您的地址上的IS NULL的測試。你會得到所有的公司和一個列(標誌),表明它是否沒有地址的文件。

SELECT 
     company_id, 
     companies.company_name, 
     MAX(CASE WHEN address.address_id IS NULL then 1 else 0 end) as NoAddressOnFile 
    FROM 
     companies 
     LEFT OUTER JOIN employees 
      ON companies.company_id = employees.company_id 
      LEFT OUTER JOIN addresses  
       ON employees.employee_id = address.employee_id 
    GROUP BY 
     companies.company_id;