2017-12-03 13 views
0

要約すると、私は複数のサイトと複数の部門を所有するいくつかの企業があります。各部門には1つ以上のサイトがあります。私はすべての企業の部門テーブルとサイトテーブルを再利用しています。私は本質的に各企業が引き出す部門とサイトのグローバルなプールを持っています。私の最終目標は、会社の部門に属するすべてのサイトを引き出すことです。追加テーブルの条件に基づいて行を選択する

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に関連しています。どのように私はsiteを選択するために使用されたものと同じcompany.idことを保証し、追加の条件またはクエリを追加することができます

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_divisionsテーブルを取得する方法を見つけ出すように見えることはできませんcompany_sitesでは、company.idcompany_divisionであり、division.id

たとえば、company.id = 2division.id = 3の場合、site 2site 3の結果が予想されます。

常に批判的です。

+0

を返します

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 

を... – RohitS

+0

@RohitS私はdivsion_siteテーブルを追加することを検討しましたが、問題は複数の企業が同じ部門を使用することができました。たぶん、私は餌をカットして、各社を独自のデータベースに生かすべきでしょうか? – atomSmasher

+0

最後の呼び出しはあなたのものですが、複数の同じ部門がある場合、あなたの目的は会社に属する部門からすべてのサイトを取得することです。 – RohitS

答えて

2

このようなツリー構造では、私はおそらくcompany_divisionsテーブルとcompany_sitesテーブルを削除し、そのように設計します。以降、ここから

+-------------+------------+-----------+ 
| 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 | 
+-------------+------------+-----------+ 

フィルタリングを与えるだろうクエリ

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 

を使用

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. 

だけWHERE条件の後ろに追加し、非常に簡単にする必要があります。

+0

これはうまくいきます。私はこの角度から問題に近づくことは考えていませんでした。あなたは良いmysqlの本や参照をお勧めできますか? – atomSmasher

0

あなたがこのようなコードで指定したコードは、company_site.company = 3(テーブルに存在しない値)を確認します。 company_divisionsテーブルと同様に実際には、会社はありません3.存在するデータを試してください

+0

私はお詫びします、それは一般的なケースであることを意味しました。私は最終的な例に合わせて数字を更新しました。 – atomSmasher

1

私はあなたが構造を変更し、別の部門のサイトのマッピングテーブルを変更することができればこれを提案します。これにより、サイトが複数の部門に複数のサイトに所属することも可能になります。

会社表:

+----+-------------+ 
| 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  | 
+----+-------------+--------------+ 

だからあなたのようなもの持つことができます。あなたが部門に属するサイトをフェッチするために、サイトまたはその逆への分裂のいくつかのマッピングを持っている必要があり

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

これはうまくいくが、私は最初の応答を先に進めた。お手伝いありがとう。 – atomSmasher

+0

@atomSmasherそのあなたの呼び出し...しかし、ソリューションを入れて幸せ..:D – RohitS

関連する問題