powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка всех неработающих людей
11 сообщений из 11, страница 1 из 1
Выборка всех неработающих людей
    #39791086
FolkHealer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые форумчане, добрый день.

Помогите, пожалуйста, с запросом: необходимо выбрать всех уволенных людей, использование только IS NOT NULL не подходит, т.к. у человека может быть несколько сотрудников, следовательно он может попасть в выборку как уволенный, но при этом работать по другой записи.

Имеется две таблицы: profile (столбцы id, name) и employees (id, profile_id, date_start, date_end)

В запрос вида SELECT * FROM employees WHERE date_end IS NOT NULL попадают все записи, у которых есть дата увольнения, но как писал выше - в таблице employees у человека может быть не одна запись, и по ней человек может работать.
...
Рейтинг: 0 / 0
Выборка всех неработающих людей
    #39791140
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Структуру (CREATE TABLE), пример наполнения с разными вариантами сочетания приёмов-увольнений (INSERT INTO) и результат на именно этих данных (тег Table, разделитель полей запятая) - сюда, или в виде fiddle.
...
Рейтинг: 0 / 0
Выборка всех неработающих людей
    #39791141
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чисто от фонаря:
Код: sql
1.
HAVING COUNT(date_start) = COUNT(date_end)
...
Рейтинг: 0 / 0
Выборка всех неработающих людей
    #39791196
FolkHealer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, доброго времени суток, запрашиваемые данные:

Таблица profile
create table profile
(
id int(255) auto_increment
primary key,
name varchar(255) not null
);

Таблица employees
create table employees
(
id int(255) auto_increment
primary key,
profile_id int(255) null,
date_start date null,
date_end date null
);

Пример заполнения таблиц приложил к ответу. К примеру, человек с id=4 в таблице profile в данный момент работает, но у него также имеется запись о том, что он когда-то был уволен. По факту необходимо чтоб в выборку попал только человек с id=5, т.к. только у него на данный момент есть "активная" дата увольнения.

Спасибо.
...
Рейтинг: 0 / 0
Выборка всех неработающих людей
    #39791201
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FolkHealerПример заполнения таблиц приложил к ответу. К примеру, человек с id=4 в таблице profile в данный момент работает, но у него также имеется запись о том, что он когда-то был уволен. По факту необходимо чтоб в выборку попал только человек с id=5, т.к. только у него на данный момент есть "активная" дата увольнениТогда я угадал. См. код выше. Ну, может, ещё добавить проверку, что COUNT(date_start) > 0
...
Рейтинг: 0 / 0
Выборка всех неработающих людей
    #39791210
FolkHealer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, либо я что-то не так записал с ваших слов, либо я некорректно описал задачу в исходном обращении...

Добавил в таблицу employees записей:
id profile_id date_start date_end
1 4 2019-03-01 2019-03-15
2 4 2019-03-16
3 3 2019-03-01
4 5 2019-03-01 2019-03-24
5 1 2019-03-01 2019-03-15
6 1 2019-03-18 2019-03-22
7 1 2019-03-23 2019-03-24
8 2 2019-03-01 2019-03-31
9 3 2019-03-15

При таких значениях в выдаче должны остаться люди, с id = 5, 1, 2

Сам запрос:
SELECT profile_id, COUNT(date_start), COUNT(date_end)
FROM employees
WHERE date_end IS NOT NULL
GROUP BY profile_id HAVING COUNT(date_start) = COUNT(date_end) AND COUNT(date_start) > 0

Но на выходе получается следующее: (приложил файл к сообщению)
...
Рейтинг: 0 / 0
Выборка всех неработающих людей
    #39791211
FolkHealer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FolkHealer, пардон, не с id, а с profile_id.

4 profile_id в выборке должен отсутствовать
...
Рейтинг: 0 / 0
Выборка всех неработающих людей
    #39791251
niteshade
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FolkHealer,
уберите WHERE date_end IS NOT NULL
...
Рейтинг: 0 / 0
Выборка всех неработающих людей
    #39791266
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
SELECT profile_id
FROM employees
GROUP BY profile_id 
HAVING COUNT(date_start) = COUNT(date_end) 
   AND COUNT(date_start) > 0
...
Рейтинг: 0 / 0
Выборка всех неработающих людей
    #39791267
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Впрочем, если выбирать из одной таблицы, то условие AND COUNT(date_start) > 0 избыточно:
Код: sql
1.
2.
3.
4.
SELECT profile_id
FROM employees
GROUP BY profile_id 
HAVING COUNT(date_start) = COUNT(date_end) 


Это условие нужно, если мы получаем данные по профилю из таблицы профилей, причём надо отобразить все профили, включая те, что не имеют записей в employees:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT profiles.*
FROM profiles
LEFT JOIN employees ON profiles.id = employees.profile_id
GROUP BY profile_id 
HAVING COUNT(date_start) = COUNT(date_end) 
   AND COUNT(date_start) > 0
...
Рейтинг: 0 / 0
Выборка всех неработающих людей
    #39791524
FolkHealer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, большое спасибо! Извините, что не понял вас с первого вашего сообщения. Сейчас всё отрабатывает великолепно!
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка всех неработающих людей
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]