Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2009, 12:34   #1
sinj
программирователь
Пользователь
 
Аватар для sinj
 
Регистрация: 15.02.2009
Сообщений: 72
По умолчанию составить запрос с учетом времени

Доброго времени суток!

Имеется такая вот задача:
В бд mysql имеется некая таблица. В ней хранятся данные по работе отдельных сотрудников. Необходимо вывести перечень сотрудников (у каждого свой уникальный номер) и его текущее дело. Дело задается отдельно, с указанием даты и времени. Т.е. нужно составить такой запрос, чтобы напротив фамилии сотрудника было указано его дело - т.е. дело, которое имеет максимальную дату и на эту дату-максимальное время. Все данные хранятся в одной таблице. Новое дело просто туда добавляется. Если кто может подсказать как это реализовать - буду очень признателен.
smile
sinj вне форума Ответить с цитированием
Старый 08.06.2009, 13:46   #2
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Код:
select
  emp_no,
  max(emp_name) emp_name,
  max(emp_private_affair_date_time) emp_date
from employee
group by emp_no
soleil@mmc вне форума Ответить с цитированием
Старый 08.06.2009, 13:51   #3
sinj
программирователь
Пользователь
 
Аватар для sinj
 
Регистрация: 15.02.2009
Сообщений: 72
По умолчанию

Спасибо! А нельзя ли пояснить следующий фрамент?

Код:
  max(emp_name) emp_name,
  max(emp_private_affair_date_time) emp_date
smile
sinj вне форума Ответить с цитированием
Старый 08.06.2009, 15:06   #4
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от sinj Посмотреть сообщение
Спасибо! А нельзя ли пояснить следующий фрамент?

Код:
  max(emp_name) emp_name,
  max(emp_private_affair_date_time) emp_date
emp_name - ФИО работника, оно в принципе соответствует номеру emp_no, но чтобы не писать его в условие груп_бай пишем его в агрегат max;
emp_private_affair_date_time - поле с датой_временем_дела
soleil@mmc вне форума Ответить с цитированием
Старый 08.06.2009, 15:18   #5
sinj
программирователь
Пользователь
 
Аватар для sinj
 
Регистрация: 15.02.2009
Сообщений: 72
По умолчанию

все получилось. Спасибо огромное!!!
smile
sinj вне форума Ответить с цитированием
Старый 08.06.2009, 21:22   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
emp_name - ФИО работника, оно в принципе соответствует номеру emp_no, но чтобы не писать его в условие груп_бай пишем его в агрегат max;
угу. всё правильно.
а можно поинтересоваться, а чем group by не угодил? ;(
Мне, например, подобные фокусы не очень нравятся (правда, в практике это бывает иногда полезно). Но поясните, пожалуйста, в данном случае, чем
Код:
select
  emp_no,  max(emp_name) from ... group by emp_no
лучше чем:
Код:
select
  emp_no,  emp_name from ... group by emp_no, emp_name
???
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.06.2009, 22:53   #7
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
угу. всё правильно.
а можно поинтересоваться, а чем group by не угодил? ;(
Мне, например, подобные фокусы не очень нравятся (правда, в практике это бывает иногда полезно). Но поясните, пожалуйста, в данном случае, чем
Код:
select
  emp_no,  max(emp_name) from ... group by emp_no
лучше чем:
Код:
select
  emp_no,  emp_name from ... group by emp_no, emp_name
???
в самом вопросе нет никаких ссылок на структуру таблицы/таблиц, поэтому за основу взято поле emp_no
логичнее конечно было бы иметь дело с отдельным справочником сотрудников + таблица ссылок на дела
по-хорошему, group by логичнее делать в данном случае по праймари
или хотя бы по признаку близкому к нему
ну а ФИО сотрудников не является таковым - могут быть полные тёзки
поэтому отдельно group by по ФИО делать не стоит, а совместно с праймари можно
soleil@mmc вне форума Ответить с цитированием
Старый 08.06.2009, 23:11   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

э нет... так не пойдёт.
заметьте, я же не предлагал убрать emp_no из group_by
Безусловно, это было бы в корне неверно!!

я предлагал, вместо использования max(FIO) брать просто FIO (и для этого FIO добавить в group_by после emp_no)

вот я и пытаюсь понять, этот вариант Вам почему не понравился? (между нами - просто max(fio) само написалось, и так и решили оставить, так? )
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.06.2009, 11:53   #9
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
вот я и пытаюсь понять, этот вариант Вам почему не понравился? (между нами - просто max(fio) само написалось, и так и решили оставить, так? )
не, не так
я в предыдущем ответе пытался объяснить, что ТС задал вопрос не совсем по схеме HR, которая известна в некоторых кругах
соответственно, нет никаких гарантий, что под одним emp_no вдруг не попадутся разные ФИО
отсюда и такое расплывчатое решение (собсна как и расплывчатое задание), с попыткой избежать возможных проблем в первом приближении
а точнее даже так - это не решение, а всего лишь шаблон, по которому ТС сам доделывает свою задачу (для точного решения пожалста точную постановку задачи)

Последний раз редактировалось soleil@mmc; 09.06.2009 в 11:59.
soleil@mmc вне форума Ответить с цитированием
Старый 09.06.2009, 13:41   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ладно. спасибо за ответ.
Вашу аргументацию я понял.
я как раз про это и писал:
Цитата:
соответственно, нет никаких гарантий, что под одним emp_no вдруг не попадутся разные ФИО
вот здесь, как раз эти два варианта и сработают ПРИНЦИПИАЛЬНО по разному.
select emp_no, max(FIO) вернёт одну фамилию (т.е. получатель запроса даже не увидит, что под номером X у него скрывается пяток фамилий. Он получит ОДНУ запись.
а
select emp_no, FIO ... group by emp_no, FIO вернёт вместе с номером все эти пяток фамилий...

впрочем. я соглашусь с Вами - тут всё зависит и от базы и от требований к результатам запроса...
Вот против этого -
Цитата:
шаблон, по которому ТС сам доделывает свою задачу
не попрёшь...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Необходимо составить запрос span4 SQL, базы данных 17 05.04.2009 11:43
Как составить запрос из каталога? wegeras PHP 1 28.10.2008 13:36
Как правельно составить запрос!! Areostar SQL, базы данных 3 16.02.2008 19:49
составить запрос к таблицам T1 и T2 MonteCarlos SQL, базы данных 13 03.02.2008 14:05
SOL-запрос интервала даты и времени в Delphi DENIS_ БД в Delphi 5 23.12.2006 12:55