Проконсультируйте в одном деле!
Не сильный я специалист в SQL пока что)
Есть такая структура базы (примерный вариант в ворде нарисовал).
У меня есть документы и есть сотрудники, которые эти документы должны исполнять.
Тут как бы получается что 1 документ может быть для многих сотрудников, но и для 1-го сотрудника много документов, т.е получается связь многие-ко-многим. Чтобы её не было,я создаю промежуточную таблицу "Исполнение". В ней поле "boss_sotrud" принимает значение 0 и 1: например на один документ назначено 5 исполнителей, среди них надо выбрать главного (ответственного), вот дял него этот параметр = 1, а для других просто 0.

Делая вот такой запрос:
SELECT doc.*, sotrud.name_sotrud
FROM doc, ispol, sotrud
WHERE
doc.id_doc = ispol.id_doc AND
sotrud.id_sotrud = ispol.id_sotrud AND
ispol.boss_sotrud=1
Я получаю:

А как и что мне надо сделать, чтобы получить вот такого плана результат:

Нужен ли тут GROUP BY или можно без него обойтись как-то?
Что скажете?
Спустя 4 минуты, 2 секунды (27.04.2011 - 21:11) Игорь_Vasinsky написал(а):
Для Иванова так наверно:
SELECT doc.*, sotrud.name_sotrud
FROM doc, ispol, sotrud
WHERE doc.id_doc = ispol.id_doc
AND sotrud.id_sotrud = ispol.id_sotrud
AND ispol.boss_sotrud=1
AND sotrud.name_sotrud = 'Иванов'
Спустя 41 минута, 32 секунды (27.04.2011 - 21:53) Гость_alex написал(а):
А вот чтобы сразу так для всех делать, не получится?
Надо каждого сотрудника отдельно вводить?
Надо каждого сотрудника отдельно вводить?
Спустя 3 минуты, 15 секунд (27.04.2011 - 21:56) Игорь_Vasinsky написал(а):
Скока фамилий - стока запросов. Сужу по скрину. Чтобы получит такой вывод - для каждого работника сой запрос + свой вывод
Спустя 4 минуты, 16 секунд (27.04.2011 - 22:00) SlavaFr написал(а):
order by sotrud.id_sotrud
ну а потом при помощи скрипта выдавать начинать нувую <table>
в случае если меняется актуалное sotrud.id_sotrud не соответствует предыдущему.
ну а потом при помощи скрипта выдавать начинать нувую <table>
в случае если меняется актуалное sotrud.id_sotrud не соответствует предыдущему.
Спустя 2 минуты, 35 секунд (27.04.2011 - 22:03) Игорь_Vasinsky написал(а):
SlavaFr
Совсем ТС запутаешь
Совсем ТС запутаешь

Спустя 2 часа, 1 минута, 19 секунд (28.04.2011 - 00:04) Гость_alex написал(а):
Вообще у меня есть скрины таких отчётов, но сделано всё это на Делфи.
Мне надо тоже самое сделать на PHP и MySQL. Вот какие мне скрины прислали:



Вот последний 3-й вариант он не сложный, тут его вначале я написал.
В 1-м варианте, я так полагаю, надо сделать GROUP BY sotrud.name_sotrud и в самом Селекте еще дописать COUNT(*), чтобы по каждому сотруднику суммировал, сколько каждый сотрудник исполнил документов. Тут, впринципе тоже вроде понятно.
Но вот как 2-й вариант сделать, чёт я не соображу. Причём в делфи это сделано всё за один раз (только я не знаю как, кода у меня нет, только скрины результатов мне прислали). А как это мне за один раз сделать, вот вопрос...
Мне надо тоже самое сделать на PHP и MySQL. Вот какие мне скрины прислали:



Вот последний 3-й вариант он не сложный, тут его вначале я написал.
В 1-м варианте, я так полагаю, надо сделать GROUP BY sotrud.name_sotrud и в самом Селекте еще дописать COUNT(*), чтобы по каждому сотруднику суммировал, сколько каждый сотрудник исполнил документов. Тут, впринципе тоже вроде понятно.
Но вот как 2-й вариант сделать, чёт я не соображу. Причём в делфи это сделано всё за один раз (только я не знаю как, кода у меня нет, только скрины результатов мне прислали). А как это мне за один раз сделать, вот вопрос...
Спустя 16 часов, 18 минут, 20 секунд (28.04.2011 - 16:22) Guest написал(а):
SlavaFr,
>>order by sotrud.id_sotrud
ну а потом при помощи скрипта выдавать начинать нувую <table>
в случае если меняется актуалное sotrud.id_sotrud не соответствует предыдущему.
Да, так и сделал
>>order by sotrud.id_sotrud
ну а потом при помощи скрипта выдавать начинать нувую <table>
в случае если меняется актуалное sotrud.id_sotrud не соответствует предыдущему.
Да, так и сделал

Спустя 3 часа, 25 минут, 23 секунды (28.04.2011 - 19:48) SlavaFr написал(а):
както я не по русски написал :-)
Попробую еще раз.
1) читаеш с order by sotrud.id_sotrud
2)обявляеш переменную $id_sotrud=false;
3) считываеш таблицу в цикле и проверяеш отличается ли в актуальной строчке значение id_sotrud от $id_sotrud
если отличается, то начинаеш новую таблицу делать и изменяеш значение $id_sotrud на актуальное.
короче приблизительно так:
Попробую еще раз.
1) читаеш с order by sotrud.id_sotrud
2)обявляеш переменную $id_sotrud=false;
3) считываеш таблицу в цикле и проверяеш отличается ли в актуальной строчке значение id_sotrud от $id_sotrud
если отличается, то начинаеш новую таблицу делать и изменяеш значение $id_sotrud на актуальное.
короче приблизительно так:
while($result=mysql_fetch_assoc($link)){
if($id_sotrud != $result['id_sotrud']){
if($id_sotrud == false){
echo '<table>';
}else{
echo '</table><table>';
}
$id_sotrud = $result['id_sotrud'];
}
echo '<tr><td>'.$result[..........'</td></tr>';
}
Спустя 18 часов, 41 минута, 48 секунд (29.04.2011 - 14:30) Гость_alex написал(а):
SlavaFr, да, только я через foreach прогнал всё, но это не суть важно)
Спасибо за это
Чуток переделал схему и с новым вопросом)
Схема обновилась только полями в таблице документов:

Теперь если я делаю всё тот же запрос (который я вообще в самом начале писал), то получаю:

Для документа есть Контрольный срок исполнения (т.е к какому числу его надо исполнить), и относительно него документ либо исполнен ВО ВРЕМЯ, либо исполнен С ОПОЗДАНИЕМ.
Вопрос:
Как мне написать запрос, чтобы в результате получилось как на картинке ниже.
Т.е для каждого исполнителя надо просуммировать документы, т.е сколько на каждого всего документов приходится, а так же из этого количества указать, что типа исполнено в срок СТОЛЬКО, а с опозданием СТОЛЬКО...
Тут какие-нить запросы с подзапросами писать надо или как?
Спасибо за это

Чуток переделал схему и с новым вопросом)
Схема обновилась только полями в таблице документов:

Теперь если я делаю всё тот же запрос (который я вообще в самом начале писал), то получаю:

Для документа есть Контрольный срок исполнения (т.е к какому числу его надо исполнить), и относительно него документ либо исполнен ВО ВРЕМЯ, либо исполнен С ОПОЗДАНИЕМ.
Вопрос:
Как мне написать запрос, чтобы в результате получилось как на картинке ниже.
Т.е для каждого исполнителя надо просуммировать документы, т.е сколько на каждого всего документов приходится, а так же из этого количества указать, что типа исполнено в срок СТОЛЬКО, а с опозданием СТОЛЬКО...
Тут какие-нить запросы с подзапросами писать надо или как?

Спустя 2 часа, 19 минут, 4 секунды (29.04.2011 - 16:49) Гость_alex написал(а):
Кажись получилось))
Написал что-то типа такого:
Написал что-то типа такого:
SELECT sotrud.name_sotrud, sotrud.dolgnost,
COUNT(doc.number_doc) as total,
SUM(doc.date_ispol <= doc.date_control) as vovremya,
SUM(doc.date_ispol > doc.date_control) as opozdanie
FROM doc, ispol, sotrud
WHERE
doc.id_doc = ispol.id_doc AND
sotrud.id_sotrud = ispol.id_sotrud AND
ispol.boss_sotrud=1