2012-04-29 2 views
2

У меня просто одна, наверное, туманная проблема, но я не могу решить эту проблему.Как выполнить запрос через три таблицы, соединенных промежуточной таблицей?

я в настоящее время есть 3 таблицы:

PROJECT  
PROJECT_CATEGORY  
CATEGORY 

Теперь PROJECT_CATEGORY промежуточная таблица поэтому она содержит только первичный ключ из PROJECT и CATEGORY как pID и cID.

Я знаю, как я могу написать запрос, если у меня есть pID в таблице CATEGORY, но в этом случае у меня есть только промежуточная таблица. Итак, как я могу создать запрос, который будет проверять эти 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' недостающий:' из категории c' – Pedro

+0

Спасибо, я забыл Тата я можно использовать более одного раза INNER JOIN ^^ – HyperX

+0

@Pedro: Спасибо за это. Исправлено. –

2

Если я правильно понял, вы хотите найти, есть ли у категории проект или нет. Следующий запрос показывает, сколько проектов связано с данной категорией.

Если вам нужен список всех проектов, связанных со всеми категориями, вы можете использовать второй запрос. Категория 4 не будет отображаться во втором результате из-за INNER JOIN, так как проектов, связанных с этой категорией, не существует. Если вы хотите показать категорию 4, вам необходимо изменить INNER JOIN на LEFT OUTER JOIN.

Click here to view the demo in SQL Fiddle.

Script:

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 
Смежные вопросы