2014-11-12 1 views
2

У меня есть две таблицы - вырубленные следующимT-SQL - DISTINCT и COUNT из двух таблиц

_permissions

project_id | project_name | something_else 
------------------------------------------ 
19   | name here | lksdjlskdfj 
19   | name here | dflkdkglfkg 
19   | name here | lksdjlskdfj 
20   | name here!! | dflkdkglfkg 

книги

project_id | name 
----------------- 
19   | A 
19   | B 
19   | C 
20   | D 
20   | E 

Я хотел бы, набор результатов из запроса:

результат

project_id | project_name | count 
------------------------------------------ 
19   | name here | 3 
20   | name here!! | 2 

Это ближайший я получил, но не воспользоваться. Пожалуйста, порекомендуйте! В приведенном выше примере, он выплевывает пункты 9 и 2

SELECT DISTINCT p.project_id,p.project_name,count(w.project_id) 
FROM _permissions as p 
    LEFT OUTER JOIN workbooks AS w 
     ON p.project_id = w.project_id 
GROUP BY p.project_id,p.project_name 
ORDER BY p.project_name 

Я предпочел бы использовать JOINs, если это возможно в целях повышения производительности

Существует таблица проектов с единственным полезными колонна ID

проекты

id | name 
---------------- 
19 | name here 
20 | name here!! 
+0

у вас нет таблицы проектов, не так ли? Если нет, то почему бы вам не нормализовать свою базу данных и не создать таблицу проектов. – hazimdikenli

+0

Обновленный вопрос – pee2pee

ответ

2

Это не очень хороший дизайн для ваших таблиц. У вас должна быть таблица projects, в которой есть имена каждого проекта и только один проект для каждой строки. Во всяком случае, вы могли бы сделать что-то подобное с вашим текущим дизайном:

SELECT w.project_id, 
     p.project_name, 
     w.[count] 
FROM ( SELECT project_id, COUNT(*) [count] 
     FROM workbooks 
     GROUP BY project_id) w 
INNER JOIN (SELECT project_id, MIN(project_name) project_name 
      FROM _permissions 
      GROUP BY project_id) p 
    ON w.project_id = p.project_id 

С projects столом, то запрос должен быть:

SELECT w.project_id, 
     p.project_name, 
     w.[count] 
FROM ( SELECT project_id, COUNT(*) [count] 
     FROM workbooks 
     GROUP BY project_id) w 
INNER JOIN projects p 
    ON w.project_id = p.project_id 
+0

Обновленный вопрос – pee2pee

+0

@JanuszJasinski обновил мой ответ – Lamak

+0

Мне нужно ссылаться на таблицу _permissions, так как она содержит все разрешения для каждого проекта/рабочей книги (и всего остального), но ваш первый работает хорошо! – pee2pee

-1

вы можете это:

SELECT DISTINCT p.project_id,p.project_name,count(distinct w.name) 
FROM _permissions as p 
    JOIN workbooks AS w 
     ON p.project_id = w.project_id 
GROUP BY p.project_id,p.project_name 
ORDER BY p.project_name 

работайте только в том случае, если w.name отличается.

+0

Нет, к сожалению – pee2pee

Смежные вопросы