2015-06-15 3 views
0

У меня есть база данных политиков, политических партий и кандидатур на пост на выборах. База данных состоит из следующих таблиц: Люди, Группы, Кандидаты и Должности. Таблица Candidacies - это соединение отношений между людьми и группами. Каждая запись в таблице «Кандидаты» представляет кандидатуру на выборах и связана с определенной записью (запись в таблице «Записи»). Каждый пост имеет тип почтового сообщения (сенатор, президент и т. Д.) Из таблицы PostTypes и связан с избирательным округом, в этом случае один из 10 отделов (например, государство), взятый из таблицы (отделы).Комплекс SQL с несколькими объединениями

Итак, у меня есть:

Таблица: НАРОД; PK: id Таблица: ГРУППЫ; PK: id Таблица: КАНДИДАТЫ; PK: id, FKs: id_People, id_Groups, id_Posts Таблица: POSTTYPES; PH: id Таблица: POSTS; PK: id; FK: id_Department, id_PostTypes Таблица: ОТДЕЛ; PK: id

Я пытаюсь создать оператор SQL, который будет выбирать общее количество Кандидатов определенного типа сообщения (id_PostType = X), а post - это конкретный пост (id_Post = X) из определенного отдела (id_Department = X).

У меня есть работа, когда она выбрана Почтой, но, похоже, не может получить ее для дальнейшего выбора Департаментом. Думаю, мне, возможно, понадобится сделать еще одно соединение или что-то еще, но я проиграл.

Вот что у меня есть:

SELECT g.name, COUNT(c."id") AS theCount 
FROM Candidacies c 
    JOIN Groups g 
     ON c."id_Groups" = g."id" 
    JOIN People p 
     ON c."id_People" = p."id" 
    WHERE (c."id_PostTypes" = "Senator") 
    GROUP BY g."name" 
    ORDER BY theCount 

Это, как представляется, выбирая имена и общее количество кандидатов, где тип поста является сенатором. Как теперь добавить критерии отдела конкретного сообщения?

+0

Можете ли вы добавить пример данных/ожидаемые результаты? – AdamMc331

+0

Вы все еще пытаетесь решить это? – AdamMc331

+0

Нет - я решил и дал наилучший ответ. Оба ответа были очень полезными - один из них был более подробным и понятным. – mattbowlby

ответ

0

Я думаю, что вы должны обратить внимание на то, что каждый пост имеет отдел и postType. Если вы шаг назад, вы можете выбрать все сообщения, которые принадлежат к определенной кафедре и определенной postType, как это:

SELECT p.* 
FROM posts p 
JOIN department d ON d.id = p.id_department AND d.name = 'Department1' 
JOIN postTypes pt ON pt.id = p.id_postTypes AND pt.name = 'Senator'; 

Теперь, когда у вас есть все эти должности, вы также можете присоединиться к таблице кандидатурам, и GROUP BY каждая группа, о чем вы говорите:

SELECT c.id_groups, COUNT(*) AS numCandidacies 
FROM candidacies c 
JOIN posts p ON p.id = c.id_posts 
JOIN department d ON d.id = p.id_department AND d.name = 'Department1' 
JOIN postTypes pt ON pt.id = p.id_postTypes AND pt.name = 'Senator' 
GROUP BY c.id_groups; 
+0

Спасибо за это. Очень четко объяснено и полезно. – mattbowlby

+0

@mattbowlby рад, что я мог бы помочь! – AdamMc331

0

Да, вы должны присоединиться к таблице, которая нуждается в информации через посредник, если требуется. Но будьте осторожны с совокупными функциями. Если вы не справляетесь с правильным, вы получаете тотальные неправильные результаты.

SELECT g.name, COUNT(c."id"), d.DepartmentName AS theCount 
FROM Candidacies c 
JOIN Groups g 
    ON c."id_Groups" = g."id" 
JOIN People p 
    ON c."id_People" = p."id" 
JOIN PostTypes pt 
    ON c."id_PostTypes" = pt."id" /*?*/ 
JOIN Departments d 
    ON pt.Id_Department=d.id /* suppost are these the names*/ 
WHERE (c."id_PostTypes" = "Senator") 
GROUP BY g."name", d.DepartmantName 
ORDER BY COUNT(c."id") 
+0

Теперь я понимаю, что нужно присоединиться к таблице отделов. Спасибо! – mattbowlby

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