2017-12-03 39 views
0

總而言之,我有幾家公司擁有多個站點和多個部門。每個部門都有一個或多個網站。我正在重複使用所有公司的部門和網站表格。我基本上擁有一個全球性的分支機構和網站,供每家公司使用。我的最終目標是將所有屬於公司分部的網站都拉出來。MySQL根據附加表的條件選擇行

Company 1 
    | 
    + Division 1 
    |  | 
    |  + Site 1 
    |  + Site 2 
    | 
    + Division 2 
    | 
Company 2 
    | 
    + Division 3 
    |  | 
    |  + Site 3 
    |  + Site 2 
    | 
    + Division 1 
    | 

公司

+----+-------------+ 
| id | name  | 
+----+-------------+ 
| 1 | company 1 | 
+----+-------------+ 
| 2 | company 2 | 
+----+-------------+ 

網站

+----+-------------+ 
| id | name  | 
+----+-------------+ 
| 1 | site 1 | 
+----+-------------+ 
| 2 | site 2 | 
+----+-------------+ 
| 3 | site 3 | 
+----+-------------+ 

部門

+----+-----------------+ 
| id |  name  | 
+----+-----------------+ 
| 1 | division 1 | 
+----+-----------------+ 
| 2 | division 2 | 
+----+-----------------+ 
| 3 | division 3 | 
+----+-----------------+ 

company_divisions

+----------+--------------+ 
| company | division | 
+----------+--------------+ 
|  1 |  1  | 
+----------+--------------+ 
|  1 |  2  | 
+----------+--------------+ 
|  2 |  1  | 
+----------+--------------+ 
|  2 |  3  | 
+----------+--------------+ 

company_sites

+----------+------------+ 
| company | site  | 
+----------+------------+ 
|  1 |  1  | 
+----------+------------+ 
|  1 |  2  | 
+----------+------------+ 
|  2 |  2  | 
+----------+------------+ 
|  2 |  3  | 
+----------+------------+ 

我本來以爲我可以選擇全部由company.iddivision.id制約sites的,但我已經沒有這樣的運氣。我試圖子查詢:

select * 
from sites 
where id IN (select site from company_sites where company = 3) 

,並加入:

select s.* 
from sites s 
inner join company_sites cs on s.id = cs.site 
where cs.company = 3 

但這些結果僅與company_site而不是division。我似乎無法弄清楚如何獲得company_divisions表參與..這樣的事情:

select s.* 
from sites s 
inner join company_sites cs on s.id = cs.site 
inner join company_divisions cd on divisions.id = cd.division 
where cs.company = 2 AND cd.division = 3 

我如何添加,以確保一個附加條件或查詢,同樣的company.id這是用來選擇sitecompany_sites涉及company.idcompany_division通過division.id

例如給出company.id = 2division.id = 3我期望site 2site 3的結果。

建設性的批評總是值得歡迎的。

+0

你應該以取回屬於師網站站點或反之亦然部門的一些映射.. – RohitS

+0

@RohitS我考慮添加一個divsion_site表,但問題是多家公司可以使用相同的部門。也許我應該減少誘餌,讓每家公司都住在自己的數據庫中? – atomSmasher

+0

最後的電話是你的,但如果你有多個相同的部門,你的目標是從屬於一個公司的一個部門獲取所有的網站,但仍然是這樣。 – RohitS

回答

2

對於這樣的樹結構,我可能會刪除company_divisions和company_sites表並設計它。

company 
+----+-------------+ 
| id | name  | 
+----+-------------+ 
| 1 | company 1 | 
+----+-------------+ 
| 2 | company 2 | 
+----+-------------+ 
name should be unique, id is the primary key 

divisions 
+----+-----------------+-------------+ 
| id |  name  | company id | 
+----+-----------------+-------------+ 
| 1 | division 1 |  1  | 
+----+-----------------+-------------+ 
| 2 | division 2 |  1  | 
+----+-----------------+-------------+ 
| 3 | division 3 |  2  | 
+----+-----------------+-------------+ 
| 4 | division 1 |  2  | 
+----+-----------------+-------------+ 
id is the primary key, company id is foreign key referenced to company.id. 

sites 
+----+-------------+-------------+ 
| id | name  | division id | 
+----+-------------+-------------+ 
| 1 | site 1 |  1  | 
+----+-------------+-------------+ 
| 2 | site 2 |  1  | 
+----+-------------+-------------+ 
| 3 | site 3 |  3  | 
+----+-------------+-------------+ 
| 4 | site 2 |  3  | 
+----+-------------+-------------+ 
id is the primary key, division id is foreign key referenced to divisions.id. 

使用查詢

SELECT 
    sites.name as `site`, 
    divisions.name as `division`, 
    company.name as `company` 
FROM sites 
LEFT JOIN divisions ON sites.`division id` = divisions.id 
LEFT JOIN company ON divisions.`company id` = company.id 

會從這裏起給

+-------------+------------+-----------+ 
| site  | division | company | 
+-------------+------------+-----------+ 
| site 1 | division 1 | company 1 | 
+-------------+------------+-----------+ 
| site 2 | division 1 | company 1 | 
+-------------+------------+-----------+ 
| site 3 | division 3 | company 2 | 
+-------------+------------+-----------+ 
| site 2 | division 3 | company 2 | 
+-------------+------------+-----------+ 

過濾應該是很容易的,只需要添加WHERE條件落後。

+0

這很好。我從來沒有想過要從這個角度來解決這個問題。你能推薦任何好的mysql書籍或參考嗎? – atomSmasher

0

您在這樣的事情中給出的代碼會檢查company_site.company = 3,這是表中不存在的值。與company_divisions表類似。事實上,沒有公司3.嘗試存在的數據

+0

我道歉,這是一個普通的情況。我更新了數字以匹配我的最後一個例子。 – atomSmasher

1

我會建議這個,如果你可以修改結構並有單獨的分割網站映射表。這也可以讓一個網站屬於多個分部到多個網站。

Company表:

+----+-------------+ 
| id | name  | 
+----+-------------+ 
| 1 | company_1 | 
+----+-------------+ 
| 2 | company_2 | 
+----+-------------+ 

司表:

+----+-------------+--------------+ 
| id | name  | company_id | 
+----+-------------+ -------------+ 
| 1 | division 1 |  1  | 
+----+-------------+--------------+ 
| 2 | division 2 |  2  | 
+----+-------------+--------------+ 
| 3 | division 3 |  2  | 
+----+-------------+--------------+ 
| 4 | division 4 |  3  | 
+----+-------------+--------------+ 

站點表:

+----+----------------------+ 
| id | url    | 
+----+----------------------+ 
| 1 | http:\www.url1.com | 
+----+----------------------+ 
| 2 | http:\www.url2.com | 
+----+----------------------+ 
| 3 | http:\www.url3.com | 
+----+----------------------+ 
| 4 | http:\www.url4.com | 
+----+----------------------+ 

division_site表:

+----+-------------+--------------+ 
| id | div_id | site_id  | 
+----+-------------+ -------------+ 
| 1 |  1  |  1  | 
+----+-------------+--------------+ 
| 2 |  1  |  2  | 
+----+-------------+--------------+ 
| 3 |  2  |  1  | 
+----+-------------+--------------+ 
| 4 |  2  |  3  | 
+----+-------------+--------------+ 
| 5 |  2  |  4  | 
+----+-------------+--------------+ 
| 6 |  3  |  1  | 
+----+-------------+--------------+ 
| 7 |  4  |  2  | 
+----+-------------+--------------+ 

所以,你可以有這樣的:

select company.name as company_name ,division.name as division_name ,GROUP_CONCAT(sites.url) as "Site URL's" from company inner join division on division.company_id = company.id left JOIN div_sites on div_sites.div_id = division.id inner join sites on sites.id = div_sites.site_id where company.id = 1 and division.id =1 GROUP by division.id 

這將返回

+----+-------------+-------------------+-----------------------+ 
| company name  | division name | Url's    | 
+----+-------------+-------------------+------------------------ 
| company_1  | div 1   | http:\www.url1.com, | 
|     |     | http:\www.url2.co  | 
+------------------+-------------------+-----------------------+ 
+0

這個效果很好,但我繼續第一個迴應。感謝您的幫助。 – atomSmasher

+0

@atomSmasher它的你的電話......但高興地把解決方案..:D – RohitS