Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Прочие БД - выборка из одной столбца таблицы с несколькими условиями + count

Ответить
Настройки темы
Прочие БД - выборка из одной столбца таблицы с несколькими условиями + count

Пользователь


Сообщения: 51
Благодарности: 0

Профиль | Отправить PM | Цитировать


Добрый день.
Есть 2 таблицы (1. stend_monitoring 2.stand_status) в PSQL, примерно такого содержания:
Код: Выделить весь код
num_stend	   stamp_	name_event
1205	   2020-12-16 10:05:08	Контейнер установлен
2205	   2020-11-15 12:04:08	Контейнер изъят
1205	   2020-10-14 13:07:08	Книга используется
2205	   2020-12-16 10:05:08	Контейнер установлен
1205	   2020-11-15 12:04:08	Контейнер изъят
2205	   2020-10-14 13:07:08	Книга используется
1205	   2020-12-16 10:05:08	Контейнер установлен
2205	   2020-11-15 12:04:08	Контейнер изъят
1205	   2020-10-14 13:07:08	Книга используется
2205	   2020-12-16 10:05:08	Контейнер установлен
1205	   2020-11-15 12:04:08	Контейнер изъят
2205	   2020-10-14 13:07:08	Книга используется
1205	   2020-12-16 10:05:08	Контейнер установлен
2205	   2020-11-15 12:04:08	Контейнер изъят
1205	   2020-10-14 13:07:08	Книга используется
2205	   2020-12-16 10:05:08	Контейнер установлен
1205	   2020-11-15 12:04:08	Контейнер изъят
2205	   2020-10-14 13:07:08	Книга используется
Код: Выделить весь код
num_stend  object_	name_status
1205	   1      книга у читателя
2205	   1      книга на складе
Необходим следующий select :
1) показать num_stend
2) по num_stend показать последнюю дату когда был "Контейнер изъят".
3) по num_stend показать последнюю дату когда был "Контейнер установлен".
4) по num_stend показать последнюю дату "Книга используется" после даты последнего события "Контейнер установлен".
5) по num_stend показать последнюю дату "Книга используется"
6) из второй таблицы (stand_status) нужен просто текущий name_status. (в таблице name_status постоянно обновляется, нужно просто забирать этот status)
7) Посчитать общее кол-во строк "Книга используется" после последнего события "Контейнер установлен"

Код: Выделить весь код
Попытался сделать следующим образом:
SELECT t1.num_stend as номер_стенда, t3.stamp_ as Контейнер изъят, t1.stamp_ as Контейнер установлен, t2.stamp_ as Книга используется, t4.name_event as Состояние
FROM azt.stend_monitoring t1, azt.stend_monitoring t2, azt.stend_monitoring t3, azt.stand_status t4
where t1.num_stend = '2205'
and t1.name_event = 'Контейнер установлен' 
and t2.num_stend = t1.num_stend
and t2.name_event = 'Книга используется'
and t2.stamp_ > t1.stamp_
and t3.num_stend = t1.num_stend
and t3.name_event = 'Контейнер изъят'
and t4.num_stend = t1.num_stend
and t4.object_ = 1
order by t1.id desc, t2.id desc, t3.id desc LIMIT 1
В принципе select отрабатывает, но за 9 секунд как то долговато но терпимо, а вот если я к ниму прикручиваю пункт. номер 7 (где нужно вывести общее кол-во строк), COUNT (*) и начинаю группировать GROUP BY .... то запрос уходит на 5-7 минут раздумий и я не дожидаясь результата отключаю его.
Можете помочь с оптимизацией запроса?

Отправлено: 11:35, 17-12-2020

 

Пользователь


Сообщения: 51
Благодарности: 0

Профиль | Отправить PM | Цитировать


Немного изменил скрипт, стал отрабатывать за 200 мс. Остались не решенными 2 проблемы:
1) как добавить сюда общее число строк "Книга используется" после последнего события "Контейнер установлен"
2) Можно ли как то уменьшить необходимость кол-во ввода значения num_stend.

Код: Выделить весь код
select * from
(Select MAX(num_stend) AS номер_стенда, MAX(stamp_) AS Контейнер изъят from azt.stend_monitoring where name_event = 'Контейнер изъят' and num_stend = '1205') T2,
(Select MAX(stamp_) AS Контейнер установлен from azt.stend_monitoring where name_event = 'Контейнер установлен' and num_stend = '1205') T3,
(Select MAX(stamp_) AS Последняя_транзакция from azt.stend_monitoring where name_event = 'Книга используется' and num_stend = '1205') T4,
(Select name_event AS Состояние_стенда from azt.stand_status where object_ = 1 and num_stend = '1205') T5

Отправлено: 17:09, 18-12-2020 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


правильнее было бы использовать явный LEFT JOIN

Цитата Armsinglom:
1) показать num_stend »
в такой формулировке это больше похоже на
Код: Выделить весь код
select '1205' as num_stend
показать запрошенный num_stend
а то, что вы делаете - это выбрать запрошенный num_stend

впрочем, последующие показать демонстрируют, что составивший задание просто не "рубит в теме"

Отправлено: 11:19, 19-12-2020 | #3



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Прочие БД - выборка из одной столбца таблицы с несколькими условиями + count

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Любой язык - Копирование таблицы (2 столбца) из файла .htm в Excel Serg2010 Скриптовые языки администрирования Windows 2 05-08-2015 22:18
Выборка данных из таблицы mysql vinbongun Вебмастеру 7 14-08-2013 06:23
MySQL - Выборка данных из таблицы mysql vinbongun Программирование и базы данных 0 11-08-2013 09:10
MySQL - Выборка из таблицы Sergey666 Программирование и базы данных 1 23-03-2010 06:19
выборка случайной строки из таблицы на MySQL Vlad Drakula Вебмастеру 5 19-10-2004 05:55




 
Переход