SQL Запрос, чтобы найти количество пользователей в области работы - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть три таблицы:

  1. jobAreas (id, title)
  2. jobSkills (id, title, jobAreaID)
  3. userSkills (id, userID, jobSkillID )

Каждая запись в jobSkills принадлежит JobArea (связана с внешним ключом jobAreaID). И каждая запись userSkills имеет JobSkill, связанный с jobSkill.

Я пытаюсь создать запрос выбора SQL, в котором будет указано количество пользователей, принадлежащих к каждой области задания.

SELECT ja.id, ja.title, COUNT(*) as numUsers FROM user_skill_types uskills INNER JOIN job_areas ja INNER JOIN skill_types st ON ja.id = st.parent_id GROUP BY ja.id

Но числа, которые я получаю, не верны.

Ответы [ 3 ]

0 голосов
/ 15 апреля 2020

Вы, вероятно, получаете дубликаты в своем результате из-за того, что у пользователей есть несколько навыков или заданий, имеющих несколько областей, или оба. Вместо COUNT(*) используйте COUNT(DISTINCT userID), чтобы обойти это:

SELECT ja.id, ja.title, COUNT(DISTINCT us.userID) as numUsers
FROM jobAreas ja
JOIN jobSkills js ON js.jobAreaID = ja.id
JOIN userSkills us ON us.jobSkillsID = js.id
GROUP BY ja.id, ja.title

Примечание. Я написал запрос на основе схемы в вашем вопросе. Исходя из написанного вами запроса, он, вероятно, должен выглядеть примерно так (неясно, как называется столбец user_skill_types userID или как JOIN user_skill_types до job_skills):

SELECT ja.id, ja.title, COUNT(DISTINCT uskills.userID) as numUsers 
FROM job_areas ja
JOIN skill_types st ON ja.id = st.parent_id
JOIN user_skill_types uskills ON uskills.jobSkillID = st.id
GROUP BY ja.id, ja.title
0 голосов
/ 16 апреля 2020

Учитывая следующий пример (на основе структуры таблицы, представленной в вопросе).

CREATE TABLE `jobareas` (
  `id` int(11) NOT NULL,
  `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;   
INSERT INTO `jobareas` (`id`, `title`) VALUES
(1, 'area1'),
(2, 'area2'),
(3, 'area3'),
(4, 'area4'),
(5, 'area5'),
(6, 'area6'),
(7, 'area7'),
(8, 'area8');    
-- --------------------------------------------------------
CREATE TABLE `jobskills` (
  `id` int(11) NOT NULL,
  `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `jobAreaID` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;   
INSERT INTO `jobskills` (`id`, `title`, `jobAreaID`) VALUES
(1, 'skill1', 1),
(2, 'skill2', 3),
(3, 'skill3', 3),
(4, 'skill4', 7),
(5, 'skill5', 4),
(6, 'skill6', 5),
(7, 'skill7', 1),
(8, 'skill8', 7),
(9, 'skill9', 6),
(10, 'skill10', 3),
(11, 'skill11', 4),
(12, 'skill12', 2),
(13, 'skill13', 6),
(14, 'skill14', 7),
(15, 'skill15', 2);    
-- --------------------------------------------------------
CREATE TABLE `userskills` (
  `id` int(11) NOT NULL,
  `userID` int(11) NOT NULL,
  `jobSkillID` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `userskills` (`id`, `userID`, `jobSkillID`) VALUES
(1, 5, 10),
(2, 2, 11),
(3, 4, 14),
(4, 4, 6),
(5, 2, 8),
(6, 6, 9),
(7, 3, 9),
(8, 1, 12),
(9, 1, 3),
(10, 5, 10);
ALTER TABLE `jobareas`
  ADD UNIQUE KEY `id` (`id`);
ALTER TABLE `jobskills`
  ADD PRIMARY KEY (`id`),
  ADD KEY `jobAreaID` (`jobAreaID`);
ALTER TABLE `userskills`
  ADD PRIMARY KEY (`id`),
  ADD KEY `userID` (`userID`),
  ADD KEY `jobSkillID` (`jobSkillID`);
ALTER TABLE `jobskills`
  ADD CONSTRAINT `jobskills_ibfk_1` FOREIGN KEY (`jobAreaID`) REFERENCES `jobareas` (`id`);
ALTER TABLE `userskills`
  ADD CONSTRAINT `userskills_ibfk_1` FOREIGN KEY (`jobSkillID`) REFERENCES `jobskills` (`id`);

Ваш запрос должен использовать DISTINCT.

SELECT COUNT(DISTINCT(`us`.`userID`)) AS `num`,`ja`.`title` FROM `userskills` `us` 
INNER JOIN `jobskills` `js` ON `js`.`id` = `us`.`jobSkillID`
INNER JOIN `jobareas` `ja` ON `ja`.`id` = `js`.`jobAreaID`
GROUP BY `ja`.`id`;

Результаты можно проверить в этом SQLFiddle

0 голосов
/ 15 апреля 2020

Ваш SQL Общий запрос не соответствует общей схеме. Также вы не указали, как присоединиться к таблице job_areas

Использовать

select 
    ja.id, ja.title , count(us.id) as numUsers
from jobAreas ja
INNER JOIN jobSkills js on ja.id = js.jobAreaID
INNER JOIN userSkills us on js.id = us.jobSkillID
GROUP BY ja.id, ja.title

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...