Задавайте вопросы, мы ответим
Вы не зашли.
Уважаемые специалисты, пожалуйста, помогите если возможно составить запрос
У меня есть таблица Mysql, в ней 16 полей, восьмое поле типа datetime,
как написать запрос чтобы получить за текущий день количество записей
в таблице за каждый час? или может несколько разных
Спасибо!
Неактивен
Возможно я уже сделал первый шаг к истине, придумав запрос к таблице "Bu", по 8му полю "dtl" показывающее список строк за сегодня?
Select dtl
From bu WHERE `dtl` BETWEEN CURRENT_DATE AND CURRENT_DATE+INTERVAL 1 DAY GROUP BY `dtl`
наверное можно и короче, но я не разобрался как, а по часам не знаю как разбить чтобы посчитать. еще раз прошу помогите пожалуйста решить эту задачу.
Неактивен
В итоге родил запрос, скажите пожалуйста он оптимальный и правильный по смыслу?
Select Count(*),
Date(bu.dtl) As dddd,
Hour(bu.dtl) As hhhh
From bu
Where bu.dtl Between Current_Date And Current_Date + Interval 1 Day
Group By hhhh
Неактивен
В условиях этой задачи — да. Но он мало использует индекс. Если, например,
хранить отдельно «час» каждой записи, то запрос можно переписать, чтобы работал
еще быстрее
Неактивен
Еще раз прошу помощи ) как продолжение данного запроса - у меня есть два запроса выдающие количество полей за текущий день за каждый час из одной таблицы бд вот они:
Select Count(*) As cccc,
Date(bu.dtl) As dddd,
Hour(bu.dtl) As hhhh
From bu
Where bu.dtl Between Current_Date And Current_Date + Interval 1 Day
Group By hhhh
и
Select Count(*) As cccf,
Date(bu.dtf) As dddf,
Hour(bu.dtf) As hhhf
From bu
Where bu.dtf Between Current_Date And Current_Date + Interval 1 Day
Group By hhhf
dtf и dtl поля типа datetime,
как мне одним запросом делать то что я делаю в этих двух?
Неактивен
marvin написал:
как мне одним запросом делать то что я делаю в этих двух?
Неактивен
Уважаемый Василий, если я обьединяю эти два запроса юнионом (беру их в скобки) то не работает, мне кажется тут дело в Count?
для ясности приведу вид таблицы:
+ -----------------+-----------------------+------------------------+-------------------------|
|номер(примари)| (datetime) dtf | (datetime) dtl | неск. др. столбиков |
+ -----------------|------------------------|-------------------------|-------------------------|
+ 1183 |2009-07-10 10:00:40|2009-07-10 10:23:33|-------------------------|
+ -----------------|------------------------|-------------------------|-------------------------|
+ 1286 |2009-07-10 10:32:08|2009-07-10 11:01:45|-------------------------|
+ -----------------|------------------------|-------------------------|-------------------------|
+ 1242 |2009-07-10 10:10:31|2009-07-10 10:38:21|--------------------------|....
в запросах я пытаюсь посчитать количество строк со временем dtf за каждый час и количество строк со временем dtl за каждый час, кроме того часы подсчета должны относиться к сегодняшнему дню
Отредактированно marvin (23.07.2009 01:55:48)
Неактивен
marvin написал:
Уважаемый Василий, если я обьединяю эти два запроса юнионом (беру их в скобки) то не работает, мне кажется тут дело в Count?
Не ясно, что значит "не работает"?
Могу лишь предположить, у вас убираются дубликаты, и поэтому результат не соответствует ожидаемому. В этом случае используйте UNION ALL.
Неактивен
чтобы не было недопониманий предлагаю разобрать на вот таком примере:
CREATE TABLE `bu` (
`id` int(11) NOT NULL,
`dtf` datetime NOT NULL,
`dtl` datetime NOT NULL,
`desc` varchar(30) NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `bu` VALUES(1, '2009-07-23 10:07:49', '2009-07-23 10:07:59', '111');
INSERT INTO `bu` VALUES(2, '2009-07-23 10:07:49', '2009-07-23 10:07:59', '222');
INSERT INTO `bu` VALUES(3, '2009-07-23 11:07:49', '2009-07-23 11:07:59', '333');
INSERT INTO `bu` VALUES(4, '2009-07-23 12:07:49', '2009-07-23 12:07:59', '444');
INSERT INTO `bu` VALUES(5, '2009-07-23 12:07:49', '2009-07-23 13:07:59', '555');
я выполняю вот такой запрос (если неправильно написал прошу исправить)
(Select Count(*) As cccf,
Date(bu.dtf) As dddf,
Hour(bu.dtf) As hhhf
From bu
Where bu.dtf Between Current_Date And Current_Date + Interval 1 Day
Group By hhhf)
union all
(Select Count(*) As cccl,
Date(bu.dtl) As dddl,
Hour(bu.dtl) As hhhl
From bu
Where bu.dtl Between Current_Date And Current_Date + Interval 1 Day
Group By hhhl)
и получаю 3 столбика - cccf,dddf,hhhf, причем в столбике hhhf идет время из dtf а потом из dtl
а мне нужно получит 5 столбиков - dddf,cccf,hhhf,cccl,hhhl (т.к. dddf = dddl = сегодняшней дате)
Неактивен
Неактивен
Спасибо огромное Василий! запрос работает великолепно - выводит то что надо, однако на днях я понял что мой запрос который мы модифицировали не совсем верен - не выводит те записи за то время в которое они не добавлялись. т.е. если в 16часов нет записи в БД, то он эту цифру пропустит, а мне нужно чтобы выдавало 0 если не было строки. эту проблему решил вводом таблицы hours содержащей единственное поле value и содержащее 24 строчки (от 0 до 23):
CREATE TABLE `hours` (
`value` int(2) NOT NULL,
PRIMARY KEY (`value`)
);
INSERT INTO `hours` VALUES(0);
INSERT INTO `hours` VALUES(1);
INSERT INTO `hours` VALUES(2);
INSERT INTO `hours` VALUES(3);
INSERT INTO `hours` VALUES(4);
INSERT INTO `hours` VALUES(5);
INSERT INTO `hours` VALUES(6);
INSERT INTO `hours` VALUES(7);
INSERT INTO `hours` VALUES(8);
INSERT INTO `hours` VALUES(9);
INSERT INTO `hours` VALUES(10);
INSERT INTO `hours` VALUES(11);
INSERT INTO `hours` VALUES(12);
INSERT INTO `hours` VALUES(13);
INSERT INTO `hours` VALUES(14);
INSERT INTO `hours` VALUES(15);
INSERT INTO `hours` VALUES(16);
INSERT INTO `hours` VALUES(17);
INSERT INTO `hours` VALUES(18);
INSERT INTO `hours` VALUES(19);
INSERT INTO `hours` VALUES(20);
INSERT INTO `hours` VALUES(21);
INSERT INTO `hours` VALUES(22);
INSERT INTO `hours` VALUES(23);
и переписал свой исходный запрос вот таким образом:
SELECT
HTime,
COUNT(bu.dtl)
FROM
(SELECT CURDATE() + INTERVAL value HOUR AS HTime FROM Hours) tmp
LEFT JOIN bu ON bu.dtl BETWEEN tmp.HTime AND tmp.HTime + INTERVAL 59 MINUTE
GROUP BY HTime
очень большая просьба - можно как-то переписать запрос который выше для работы по этому методу?
Неактивен
marvin написал:
очень большая просьба - можно как-то переписать запрос который выше для работы по этому методу?
Можно. Но не проще ли сделать JOIN итогового запроса с таблицей часов?
Неактивен
Василий, честно говоря часть этого запроса что выше я смог составив просидев за гуглом целый день, и как правильнее его писать не очень представляю
Неактивен
Неактивен
Василий, я очень благодарен за помощь в этом топе! Хочу еще ликбез вот по такому вопросу - полученный запрос работает, а при попытке создать view в phpmyadmin я получаю ошибку -
#1349 - View's SELECT contains a subquery in the FROM clause
как можно переписать этот запрос чтобы не ругалось?
(MySQL client version: 5.1.33)
Отредактированно marvin (01.08.2009 01:50:57)
Неактивен
Рекомендую посмотреть
http://sqlinfo.ru/articles/info/9.html
В статье приведены ограничения для версии MySQL 5.1 (в дальнейшем их число может сократиться).
# в определении представления нельзя использовать подзапрос в части FROM,
Неактивен