powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выдергивание кол-ва записей.
25 сообщений из 25, страница 1 из 1
Выдергивание кол-ва записей.
    #33100926
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица, в которой есть поле с временем прихода на работу и временем опоздания. Можно ли выдернуть одним запросом и количество дней, и количество опозданий?

Поясню: вот так я получаю количество дней, которые чувак отпахал.
Код: plaintext
SELECT worker.sname, COUNT(*) FROM workers, workdays WHERE workers.id = workdays.man_id
А так кол-во опозданий:
Код: plaintext
1.
SELECT worker.sname, COUNT(*) FROM workers, workdays WHERE workers.id = workdays.man_id AND workdays.opozdanie >  0 

Соответственно получаю я две разных таблицы. А надо одну. Как?

ЗЫ: MySQL 4.0.22. Пробовал вложенным запросом. Не схавал.
...
Рейтинг: 0 / 0
Выдергивание кол-ва записей.
    #33101001
wolk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
select distinct worker.sname, count(workdays.workdays_id), count(workdays.opozdanie) from workers, workdays where workers.id = workdays.man_id and workdays.opozdanie>0 or workers.id = workdays.man_id group by worker.sname;
или
select distinct worker.sname, count(workdays.workdays_id), count(workdays.opozdanie) from workers, workdays where workers.id = workdays.man_id and workdays.opozdanie>0 or workers.id = workdays.man_id group by worker.id;
...
Рейтинг: 0 / 0
Выдергивание кол-ва записей.
    #33101007
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Смотрится очень логично. Правда сейчас проверить не могу.
Но зачем DISRINKT worker.sname, если есть GROUP BY worker.sname?
...
Рейтинг: 0 / 0
Выдергивание кол-ва записей.
    #33101021
wolk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
его можно опустить, это нужно в том случае если id пользователя берется из таблицы с днями, чтоб он не повторялся
...
Рейтинг: 0 / 0
Выдергивание кол-ва записей.
    #33101022
wolk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вообще стоп, нельзя опускать, иначе выдаст одни и теже результаты несколько раз ))
...
Рейтинг: 0 / 0
Выдергивание кол-ва записей.
    #33101098
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А GROUP BY от этого не спасёт?
...
Рейтинг: 0 / 0
Выдергивание кол-ва записей.
    #33101099
wolk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасет, просто уже устал ))
...
Рейтинг: 0 / 0
Выдергивание кол-ва записей.
    #33101326
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
workers.id = workdays.man_id and workdays.opozdanie>0 or workers.id = workdays.man_id
эквивалентно
workers.id = workdays.man_id ?
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
Выдергивание кол-ва записей.
    #33101640
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoworkers.id = workdays.man_id and workdays.opozdanie>0 or workers.id = workdays.man_id
эквивалентно
workers.id = workdays.man_id ?

Что-то я с трудом понимаю.

workers.id - внешний ключь. В таблицу workdays запись вносится со следующими полями:
1 UID рабочего
2 время явки на работу
3 на сколько минут опоздал.

Соответственно, если человек не опоздал, то "на сколько минут опоздал." = 0. Мне нужно вычисляемое поле "сколько раз опоздал". Соответственно, запись должна появится и если человек за месяц ни разу не опоздал. Просто тогда она будет равна нулю. А запрос который ты привёл, если я ничего не путаю, выдернит только опоздальщиков.
...
Рейтинг: 0 / 0
Выдергивание кол-ва записей.
    #33101641
wolk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maXmoworkers.id = workdays.man_id and workdays.opozdanie>0 or workers.id = workdays.man_id
эквивалентно
workers.id = workdays.man_id ?
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm

нет
...
Рейтинг: 0 / 0
Выдергивание кол-ва записей.
    #33101645
wolk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>выдернит только опоздальщиков.

ты попробовал или просто думаешь?
у не опоздавших будет count=0, а выведет всех у для кого workers.id = workdays.man_id
...
Рейтинг: 0 / 0
Выдергивание кол-ва записей.
    #33101672
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да я это сам понял после того, как запостил Не пробовал. Ибо база на работе, а я дома.
...
Рейтинг: 0 / 0
Выдергивание кол-ва записей.
    #33102581
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolkнетпочему? ведь workers.id = workdays.man_id and workdays.opozdanie>0 or workers.id = workdays.man_id не зависит от workdays.opozdanie.
...
Рейтинг: 0 / 0
Выдергивание кол-ва записей.
    #33102670
wolk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maxmo, человеку нужно, чтоб работало - работает, какие еще могут быть вопросы, зачем флейм разводить.
---------
С уважением!
wolk.nutep.com
...
Рейтинг: 0 / 0
Выдергивание кол-ва записей.
    #33102859
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да я так, просто спросил :)
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
Выдергивание кол-ва записей.
    #33102962
wolk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maXmoда я так, просто спросил :)
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm

select worker.sname, count(workdays.workdays_id), count(workdays.opozdanie) from workers, workdays where workers.id = workdays.man_id and workdays.opozdanie>0 or workers.id = workdays.man_id group by worker.sname;
выбираем имена работников (worker.sname), подсчитываем количество рабочих дней для каждого (count(workdays.workdays_id) и workers.id = workdays.man_id - если работник ни разу не опаздывал) и кол-во опозданий (count(workdays.opozdanie) и workers.id = workdays.man_id and workdays.opozdanie>0 - если работник хоть раз опоздал), следовательно, если убрать workers.id = workdays.man_id and workdays.opozdanie>0, то получим только кол-во рабочих дней или если убрать or workers.id = workdays.man_id, то только кол-во опозданий. В завершение, чтоб записи не дублировались, группируем их по именам работников (group by worker.sname). OR указывает на то, что если для данного работника нет записей в таблице опозданий, то его все равно нужно внести в список и подсчитать для него кол-во рабочих дней по заданному критерию (or workers.id = workdays.man_id).
Вопросы есть?? ))
...
Рейтинг: 0 / 0
Выдергивание кол-ва записей.
    #33102998
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinСоответственно, если человек не опоздал, то "на сколько минут опоздал." = 0. Мне нужно вычисляемое поле "сколько раз опоздал".имхо, запрос не работает.
...
Рейтинг: 0 / 0
Выдергивание кол-ва записей.
    #33103105
wolk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maXmo SarinСоответственно, если человек не опоздал, то "на сколько минут опоздал." = 0. Мне нужно вычисляемое поле "сколько раз опоздал".имхо, запрос не работает.

Уверен?? Попробуй внимательно:

таблицы:
CREATE TABLE `workdays` (
`id` int(10) unsigned NOT NULL auto_increment,
`man_id` int(10) unsigned NOT NULL default '0',
`opozdanie` int(1) unsigned default NULL,
PRIMARY KEY (`id`)
)
INSERT INTO `workdays` VALUES (1,3,NULL),(2,3,NULL),(3,3,NULL),(4,3,NULL),(5,3,NULL),(6,2,1),(7,2,NULL),(8,2,NULL),(9,2,NULL),(10,2,1),(11,1,NULL),(12,1,1),(13,1,NULL),(14,1,NULL),(15,1,NULL);
CREATE TABLE `workers` (
`id` int(10) unsigned NOT NULL auto_increment,
`sname` varchar(10) NOT NULL default '',
PRIMARY KEY (`id`)
)
INSERT INTO `workers` VALUES (1,'user_1'),(2,'user_2'),(3,'user_3');

запрос:
select workers.sname, count(workdays.id), count(workdays.opozdanie) from workers, workdays where workers.id = workdays.man_id and workdays.opozdanie>0 or workers.id = workdays.man_id group by workers.sname;

результат:
+--------+--------------------+---------------------------+
| sname | count(workdays.id) | count(workdays.opozdanie) |
+--------+--------------------+---------------------------+
| user_1 | 5 | 1 |
| user_2 | 5 | 2 |
| user_3 | 5 | 0 |
+--------+--------------------+---------------------------+

ЗЫ имхо /dev/hands? ;)
...
Рейтинг: 0 / 0
Выдергивание кол-ва записей.
    #33103278
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ишь... вумный... я же выделил нолик красненьким. С нуллами конечно работает. Но там стоит количество минут опоздания. Можно сказать, `opozdanie` int unsigned not null default 0 и совсем не int(1).
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
Выдергивание кол-ва записей.
    #33103475
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот полезную вещь подсказали в соседнем топике
Код: plaintext
1.
2.
SELECT worker.sname, count(*) as otpahal,
sum(case when opozdanie> 0  then  1  else  0  end) as halyavil
FROM workers, workdays WHERE workers.id = workdays.man_id;
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
Выдергивание кол-ва записей.
    #33103476
wolk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я не знаю какая там структура, но все равно, тогда просто >0 заменить на is not null
---------
С уважением!
wolk.nutep.com
...
Рейтинг: 0 / 0
Выдергивание кол-ва записей.
    #33103485
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ой, group by забыл.
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
Выдергивание кол-ва записей.
    #33103684
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolkselect distinct worker.sname, count(workdays.workdays_id), count(workdays.opozdanie) from workers, workdays where workers.id = workdays.man_id and workdays.opozdanie>0 or workers.id = workdays.man_id group by worker.sname;
или
select distinct worker.sname, count(workdays.workdays_id), count(workdays.opozdanie) from workers, workdays where workers.id = workdays.man_id and workdays.opozdanie>0 or workers.id = workdays.man_id group by worker.id;

Не проканал. Завтра дамп кину.

А вообще проблема уже решена програмно. Но этож через ж.
...
Рейтинг: 0 / 0
Выдергивание кол-ва записей.
    #33106660
wolk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похоже дампа не дождемся ))
---------
С уважением!
wolk.nutep.com
...
Рейтинг: 0 / 0
Выдергивание кол-ва записей.
    #33108226
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolkПохоже дампа не дождемся ))
---------
С уважением!
wolk.nutep.com

Извините. Совсем забыл я.

Заказчик решил, что сделать надо всё по другому. В связи с этим мне на голову аврал свалился. Я заказчику объяснил "Вот видите, как удобно. Вот таблица с опозданиями. Вот таблица с явками. Смотрите, считаете. Ну и зарплату выдаёте.". Заказчик сказал "Офигеть". Таким образом, задачи, которые я не смог решить средставми СУБД будет решать заказчик средствами своих мозгов.

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


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