0

まず、意味のないタイトルでごめんなさい。これ以上のことは考えられませんでした。次の表をご覧ください。

ユーザー

+-----+-------+---------------+
|  id | name  | email         |
+-----+-------+---------------+
|   1 | NameA | namea@srv.com |
|   2 | NameB | nameb@srv.com |
|   3 | NameC | namec@srv.com |
+-----+-------+---------------+

デパートメント

+-----+---------+-------+---------+
|  id | company | name  | manager |
+-----+---------+-------+---------+
|   1 |       1 | DeptA |       1 |
|   2 |       1 | DeptB |       2 |
+-----+---------+-------+---------+

会社

+-----+------+-------+
|  id | name | owner |
+-----+------+-------+
|   1 | Buzz |     3 |
+-----+-------+------+

会社に関連するすべてのユーザーを見つける必要があります。何かのようなもの:

+---------+------------+
| user_id | company_id |
+---------+------------+
|       1 |          1 |
|       2 |          1 |
|       3 |          1 |
+---------+------------+

どうやってやるの?さまざまな種類の結合(内部、外部、完全など)について読みましたが、すべての途中でその「Department」テーブルを処理する方法がわかりませんでした。

4

3 に答える 3

3

私は2つのクエリでこれを行います:

select Department.manager as user_id, Company.id
from Company
join Department on Department.company=Company.id

union

select Company.owner as user_id, Company.id
from Company
于 2013-03-26T19:27:55.053 に答える
0
select User.id, User.name, User.email, CASE WHEN User.id = Company.Owner THEN 'YES' ELSE 'NO' END as CompanyOwner
from User
inner join Department on User.DepartmentID = Department.id
inner join Company on Company.id = Department.company

ユーザーと部門の間のエンティティ関係、おそらくユーザーテーブルのdepartmentIDが欠落していると思います。それがあなたが欠けている部分かもしれないと思います。

于 2013-03-26T21:03:42.777 に答える
0

通常、ユーザーを所属する部門にリンクする方法があります。ユーザーテーブルにDeptID列を追加します。この例では、所有者の部門はnullとして表され、管理者の部門は入力されていますが、これをどのように行うかはあなた次第です。

 User
+-----+-------+---------------+------+
|  id | name  | email         | dept |
+-----+-------+---------------+------+
|   1 | NameA | namea@srv.com |    1 |
|   2 | NameB | nameb@srv.com |    2 |
|   3 | NameC | namec@srv.com |  +++ |   
|   4 | NameD | named@srv.com |    2 |
|   5 | NameE | namee@srv.com |    2 |
+-----+-------+---------------+------+ 

したがって、部門がUserテーブルに入力されているすべての会社1ユーザーのリストを取得するには、これは簡単になります。

SELECT u.id       as user_id,
       d.company  as company_id
  FROM User u
  INNER JOIN Department d   ON u.dept=d.id
  WHERE d.company=1

UNION

SELECT owner  as user_id,
       id     as company_id
  FROM Company

Userテーブルにマネージャーの部門を入力しないことを選択した場合は、その部分にもUNIONを追加する必要があります。これは、すぐ上の最初の部分と同様の構成です。

または、代わりに、どの従業員がどの部門で働いているかを示す関連付けテーブルがある場合があります。これは、人が複数の部門で働くことができる場合に必要になることがあります。(マネージャーと所有者は、すでに説明されているため、このテーブルに含まれている必要はありません。繰り返しになりますが、あなた次第です。ただし、それらを含めると、UNIONが不要になるため、作業が簡単になります。所有者を「所有権」部門に配置することもできます。)

 UserDept
+--------+--------+
| UserID | DeptID |
+--------+--------+
|    4   |    2   |
|    5   |    2   |
+--------+--------+

SELECT u.id       as user_id,
       d.company  as company_id
  FROM UserDept u
  INNER JOIN Department d   ON u.dept=d.id
  WHERE d.company=1

(UserDeptテーブルに所有者/管理者を含めなかった場合は、必要に応じてUNIONを追加します。)

しかし、より深い例が必要な場合は、Userテーブルの名前も必要だとしましょう。

SELECT u.id       as user_id,
       d.company  as company_id,
       u.name     as user_name
  FROM User u
  INNER JOIN UserDept x     ON u.id=x.user
  INNER JOIN Department d   ON x.dept=d.id
  WHERE d.company=1
于 2013-03-26T22:47:02.997 に答える