Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Select'ы по связанным таблицам / 11 сообщений из 11, страница 1 из 1
20.02.2017, 14:27
    #39407823
Sunseer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select'ы по связанным таблицам
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE TABLE employees (
  id int(11) NOT NULL AUTO_INCREMENT,
  name varchar(64) NOT NULL,
  department varchar(64) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=1;

CREATE TABLE history (
  id int(11) NOT NULL AUTO_INCREMENT,
  employee_id int(11) NOT NULL,
  startJob datetime(0) NOT NULL,
  endJob datetime(0),
  PRIMARY KEY (id),
  FOREIGN KEY (employee_id) REFERENCES employees(id)
) ENGINE=InnoDB AUTO_INCREMENT=1;


Две таблицы: сотрудник, история посещений, связь один ко многим.
Надо сделать два отчета, присутствие (имя сотрудника, время прихода, время ухода), отсутствие (имя сотрудника) сотрудников за определенный день

По присутствию делаю так:
SELECT employees.name, history.startJob, history.endJob
FROM history
INNER JOIN employees ON history.employee_id = employees.id
GROUP BY history.employee_id, DAY(history.startJob)
но не знаю как выбрать за определенный день. В sql совсем недавно, камнями не кидать, спасибо!
И еще в дагонку вопрос, как сделать апдейт таблицы история(endJob) по айди сотрудника. Логика следующая, человек пришел, я делаю инсерт в историю - вписываю employee_id, и текущее время в startJob, endJob не трогаю.
...
Рейтинг: 0 / 0
20.02.2017, 23:50
    #39408172
MikkiMouse
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select'ы по связанным таблицам
Sunseer,

Это тебе по работе надо или учебный пример?
...
Рейтинг: 0 / 0
21.02.2017, 16:58
    #39408629
Sunseer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select'ы по связанным таблицам
MikkiMouse, учебный пример
...
Рейтинг: 0 / 0
21.02.2017, 19:16
    #39408724
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select'ы по связанным таблицам
Ну так делай. Показывай, что у тебя получается, объясняй, почему сделано именно так. Если ошибёшься - или поправим, или направим. А пока ты ничего не делаешь - нафига что-то делать нам?
...
Рейтинг: 0 / 0
22.02.2017, 01:38
    #39408829
Sunseer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select'ы по связанным таблицам
Akina,
В принципе, вы правы. По присутствию за период:
SELECT * from employees e
INNER JOIN history h ON e.id = h.employee_id
WHERE h.startJob >= ? AND h.endJob <= ?

Апдейт по окончанию работы:
UPDATE history SET endJob=?
WHERE employee_id=? AND endJob IS NULL

Но вот как сделать по отсутствию сотрудника за период?
LEFT JOIN'ом соединяю две таблицы, отсутствующей будет с NULL, но если ставлю условие по периода, эта строка не попадает.
...
Рейтинг: 0 / 0
22.02.2017, 09:22
    #39408890
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select'ы по связанным таблицам
Если под "присутствием за период" понимается полная вложенность, то запрос верный, а если и частичная - то нет. Поиск пересекающихся периодов обсуждается регулярно, поиск по форуму поможет.
Тот же подход используйте и при поиске отсутствия - LEFT JOIN по условию пересечения и отбор по history.id IS NULL.
...
Рейтинг: 0 / 0
22.02.2017, 09:24
    #39408891
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select'ы по связанным таблицам
авторесли ставлю условие по периода, эта строка не попадает.Вероятно, пишете условие отбора во WHERE? А оно должно быть в ON.
...
Рейтинг: 0 / 0
22.02.2017, 10:59
    #39408947
Sunseer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select'ы по связанным таблицам
Akina,
SELECT * FROM employees e
LEFT JOIN (SELECT employee_id from history h2 WHERE h2.startjob >= '2017-02-15' AND h2.endjob < '2017-02-20') ON e.id = h2.employee_id
WHERE e.id is NULL
что не так по синтаксису? По отсутствующим.
...
Рейтинг: 0 / 0
22.02.2017, 11:29
    #39408981
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select'ы по связанным таблицам
Да всё... должно быть типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT *
FROM employees e
LEFT JOIN history h2 
   ON     e.id        =  h2.employee_id 
      AND h2.startjob >= '2017-02-15' 
      AND h2.endjob   <  '2017-02-20'
WHERE h2.id is NULL


То есть СНАЧАЛА отбираем по времени, и только оставшееся используем для связывания.
...
Рейтинг: 0 / 0
22.02.2017, 12:20
    #39409046
Sunseer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select'ы по связанным таблицам
Akina,

SELECT * FROM employees e WHERE
NOT EXISTS(SELECT employee_id FROM history h where e.id=h.employee_id
AND h.startJob >= '2017-02-19' AND h.endJob < '2017-02-20')
а так можно ?
...
Рейтинг: 0 / 0
22.02.2017, 12:37
    #39409065
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select'ы по связанным таблицам
Да можно... почему нет-то... только в подзапросе лучше не SELECT employee_id, а тупо
Код: sql
1.
SELECT 1

- EXIST-у пофиг, какое именно значение, он проверяет только факт его наличия.

PS. И пользуйтесь тегом SRC...
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Select'ы по связанным таблицам / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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