2012-04-29 3 views
2

私はちょうどおそらく本当にばかな問題を持っていますが、私はこれを解決することはできません。私は現在、3つのテーブル持って中間テーブルで結合された3つのテーブルを照会する方法は?

:それはpIDcIDなどのPROJECTCATEGORYからのみ、主キーが含まれていますので、今すぐ

PROJECT  
PROJECT_CATEGORY  
CATEGORY 

PROJECT_CATEGORYは中間テーブルです。

私はのテーブルにpIDがある場合、どのようにクエリを書くことができますか?この場合、私は中間テーブルしか持っていません。どのようにしてこれらの3つのテーブルをチェックするクエリを作成したら、すべてのカテゴリとどのプロジェクトに割り当てられているかがわかります。

答えて

7
select c.*, p.* 
from categories c 
inner join PROJECT_CATEGORY pc on pc.category_id = c.id 
inner join projects p on pc.project_id = p.id 
+1

行方不明 'C'があります: ' – Pedro

+0

おかげC 'カテゴリーからは、私はthath私を忘れてしまいました一回以上使用することができます。INNER JOIN ^^ – HyperX

+0

@Pedro:ありがとうございました。それを修正しました。 –

2

正しく理解すれば、カテゴリにプロジェクトがあるかどうかを調べることができます。次のクエリは、特定のカテゴリに関連付けられているプロジェクトの数を示します。

すべてのカテゴリに関連付けられたすべてのプロジェクトの一覧を表示する場合は、2番目のクエリを使用できます。 INNER JOINのため、カテゴリ4は2番目の結果に表示されません。このカテゴリに関連付けられているプロジェクトがないためです。カテゴリ4を表示するには、INNER JOINLEFT OUTER JOINに変更する必要があります。

Click here to view the demo in SQL Fiddle.

スクリプト

CREATE TABLE project 
(
    projectid INT NOT NULL 
    , projectname VARCHAR(20) NOT NULL 
); 

CREATE TABLE projectcategory 
(
    projectid INT NOT NULL 
    , categoryid INT NOT NULL 
); 

CREATE TABLE category 
(
    categoryid  INT NOT NULL 
    , categoryname VARCHAR(20) NOT NULL 
); 

INSERT INTO project (projectid, projectname) VALUES 
    (1, 'project 1'), 
    (2, 'project 2'), 
    (3, 'project 3'); 

INSERT INTO category (categoryid, categoryname) VALUES 
    (1, 'category 1'), 
    (2, 'category 2'), 
    (3, 'category 3'), 
    (4, 'category 4'); 

INSERT INTO projectcategory (projectid, categoryid) VALUES 
    (1, 1), 
    (3, 2), 
    (2, 1), 
    (2, 2), 
    (2, 3), 
    (2, 2); 

SELECT   c.categoryid 
      , c.categoryname 
      , COUNT(pc.categoryid) Number_Of_Projects 
FROM   category c 
left outer join projectcategory pc 
on    pc.categoryid = c.categoryid 
GROUP BY  c.categoryid 
ORDER BY  c.categoryname; 

SELECT   c.categoryid 
      , c.categoryname 
      , p.projectid 
      , p.projectname 
FROM   category c 
inner join  projectcategory pc 
on    pc.categoryid = c.categoryid 
inner join  project p 
on    p.projectid = pc.projectid 
ORDER BY  c.categoryname; 

出力

CATEGORYID CATEGORYNAME NUMBER_OF_PROJECTS 
---------- ------------ ------------------ 
1   category 1   2 
2   category 2   3 
3   category 3   1 
4   category 4   0 

CATEGORYID CATEGORYNAME PROJECTID PROJECTNAME 
---------- ------------ --------- ----------- 
1   category 1  1  project 1 
1   category 1  2  project 2 
2   category 2  3  project 3 
2   category 2  2  project 2 
2   category 2  2  project 2 
3   category 3  2  project 2 
関連する問題