#mysql #sql #group-by #left-join #group-concat
Вопрос:
Я немного застрял в этом вопросе и надеялся на некоторую помощь. Вот где я нахожусь в настоящее время.
У меня есть эта ТЕСТОВАЯ таблица имен. Каждый человек может быть либо рекрутером, либо сотрудником. Число в Recruited_by связано с person_id .
Person_id Name Recruited_by
1 Jean Grayson 1
2 Paul Smith 7
3 John Do Null
4 Alex Lee 7
5 Lisa Kim 7
6 Bob Thompson 3
7 Mike Keen Null
8 Raymond Red 3
9 Alisson Jones 1
10 Kate James 3
Вот запрос, который у меня есть до сих пор, который я пытаюсь получить от имен рекрутеров, которые нанимают более 3 сотрудников (что в этом случае ничего не вернет) и количество сотрудников, которые НЕ были наняты кем-либо (что будет нулевыми именами).
SELECT T.Name as Employees, COUNT(T1.Name) as Not_hired
FROM Test AS T
WHERE COUNT(T1.Name) IS NULL
LEFT OUTER JOIN Test AS T1
ON T.Recruited_by = T1.Person_id
GROUP BY T.Name
HAVING COUNT(T1.Name) > 3
Однако этот запрос ничего не возвращает, когда я должен ожидать, что он вернет количество сотрудников, которые не были наняты рекрутером!
Комментарии:
1. Агрегатная функция не используется в предложении WHERE . Пожалуйста, поместите предложение WHERE после предложения ON и без aggregate. Пожалуйста, укажите ожидаемый результат.
2. Вы запрашиваете 2 разных результата, которые нельзя объединить. Каков ваш ожидаемый результат?
3. @RahulBiswas Я ожидаю увидеть что-то в одном столбце, в котором будет указано Имя, которое будет равно Null, и в другом столбце, в котором будет указано Not_hired, в котором будет отображаться числовое значение 2.
4. Если есть 5 рекрутеров, которые наняли более 3, то в результатах будет 5 строк с 5 именами в 1 столбце и числом 2 в другом столбце 5 раз?
Ответ №1:
Если вы хотите, чтобы в результатах была только 1 строка с 2 столбцами, вы можете выполнить ЛЕВОЕ объединение таблицы с запросом, который объединяет, чтобы получить идентификаторы лиц, которые наняли более 3 человек, и снова объединить, чтобы получить количество лиц, которые никем не были наняты:
SELECT GROUP_CONCAT(CASE WHEN t2.Recruited_by IS NOT NULL THEN t1.Name END ORDER BY t1.Name) names,
SUM(t1.Recruited_by IS NULL) total_not_recruited
FROM Test t1
LEFT JOIN (
SELECT Recruited_by
FROM Test
GROUP BY Recruited_by
HAVING COUNT(*) > 3
) t2 ON t2.Recruited_by = t1.Person_id;
Вы получите имена людей, которые наняли более 3 человек (если они существуют) в виде списка, разделенного запятыми.
Смотрите демонстрацию.