SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 09.07.2009 13:28:51

marvin
Участник
Зарегистрирован: 09.07.2009
Сообщений: 12

Помогите с запросом (datetime)

Уважаемые специалисты, пожалуйста, помогите если возможно составить запрос

У меня есть таблица Mysql, в ней 16 полей, восьмое поле типа datetime,
как написать запрос чтобы получить за текущий день количество записей
в таблице за каждый час? или может несколько разных

Спасибо!

Неактивен

 

#2 09.07.2009 16:38:24

marvin
Участник
Зарегистрирован: 09.07.2009
Сообщений: 12

Re: Помогите с запросом (datetime)

Возможно я уже сделал первый шаг к истине, придумав запрос к таблице "Bu", по 8му полю "dtl" показывающее список строк за сегодня?

Select dtl
From bu WHERE `dtl` BETWEEN CURRENT_DATE AND CURRENT_DATE+INTERVAL 1 DAY GROUP BY `dtl`

наверное можно и короче, но я не разобрался как, а по часам не знаю как разбить чтобы посчитать. еще раз прошу помогите пожалуйста решить эту задачу.

Неактивен

 

#3 09.07.2009 17:33:17

marvin
Участник
Зарегистрирован: 09.07.2009
Сообщений: 12

Re: Помогите с запросом (datetime)

В итоге родил запрос, скажите пожалуйста он оптимальный и правильный по смыслу?

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

Неактивен

 

#4 09.07.2009 19:46:34

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите с запросом (datetime)

В условиях этой задачи — да. Но он мало использует индекс. Если, например,
хранить отдельно «час» каждой записи, то запрос можно переписать, чтобы работал
еще быстрее smile

Неактивен

 

#5 22.07.2009 00:06:43

marvin
Участник
Зарегистрирован: 09.07.2009
Сообщений: 12

Re: Помогите с запросом (datetime)

Еще раз прошу помощи smile) как продолжение данного запроса - у меня есть два запроса выдающие количество полей за текущий день за каждый час из одной таблицы бд вот они:

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,

как мне одним запросом делать то что я делаю в этих двух?

Неактивен

 

#6 22.07.2009 03:05:48

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите с запросом (datetime)

marvin написал:

как мне одним запросом делать то что я делаю в этих двух?

UNION
http://dev.mysql.com/doc/refman/5.0/en/union.html

Неактивен

 

#7 23.07.2009 01:03:13

marvin
Участник
Зарегистрирован: 09.07.2009
Сообщений: 12

Re: Помогите с запросом (datetime)

Уважаемый Василий, если я обьединяю эти два запроса юнионом (беру их в скобки) то не работает, мне кажется тут дело в 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)

Неактивен

 

#8 23.07.2009 04:26:20

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите с запросом (datetime)

marvin написал:

Уважаемый Василий, если я обьединяю эти два запроса юнионом (беру их в скобки) то не работает, мне кажется тут дело в Count?

Не ясно, что значит "не работает"?

Могу лишь предположить, у вас убираются дубликаты, и поэтому результат не соответствует ожидаемому. В этом случае используйте UNION ALL.

Неактивен

 

#9 23.07.2009 11:35:37

marvin
Участник
Зарегистрирован: 09.07.2009
Сообщений: 12

Re: Помогите с запросом (datetime)

чтобы не было недопониманий предлагаю разобрать на вот таком примере:

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 = сегодняшней дате)

Неактивен

 

#10 23.07.2009 20:46:01

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите с запросом (datetime)

(select * from
(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) t1 left join
(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) t2 on hhhf=hhhl)
union
(select * from
(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) t1 right join
(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) t2 on hhhf=hhhl);

Неактивен

 

#11 29.07.2009 22:05:09

marvin
Участник
Зарегистрирован: 09.07.2009
Сообщений: 12

Re: Помогите с запросом (datetime)

Спасибо огромное Василий! запрос работает великолепно - выводит то что надо, однако на днях я понял что мой запрос который мы модифицировали не совсем верен - не выводит те записи за то время в которое они не добавлялись. т.е. если в 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

очень большая просьба - можно как-то переписать запрос который выше для работы по этому методу?

Неактивен

 

#12 29.07.2009 23:46:55

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите с запросом (datetime)

marvin написал:

очень большая просьба - можно как-то переписать запрос который выше для работы по этому методу?

Можно. Но не проще ли сделать JOIN итогового запроса с таблицей часов?

Неактивен

 

#13 29.07.2009 23:48:47

marvin
Участник
Зарегистрирован: 09.07.2009
Сообщений: 12

Re: Помогите с запросом (datetime)

Василий, честно говоря часть этого запроса что выше я смог составив просидев за гуглом целый день, и как правильнее его писать не очень представляю

Неактивен

 

#14 30.07.2009 06:35:29

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите с запросом (datetime)


(select * from
(select * from
(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) t1 left JOIN
(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) t2 ON hhhf=hhhl) tm right join `hours` on `value`=hhhf)
UNION
(select * from
(select * from
(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) t1 right JOIN
(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) t2 ON hhhf=hhhl) tm right join `hours` on `value`=hhhf);
 

Неактивен

 

#15 01.08.2009 01:50:40

marvin
Участник
Зарегистрирован: 09.07.2009
Сообщений: 12

Re: Помогите с запросом (datetime)

Василий, я очень благодарен за помощь в этом топе! Хочу еще ликбез вот по такому вопросу - полученный запрос работает, а при попытке создать 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)

Неактивен

 

#16 01.08.2009 03:06:22

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите с запросом (datetime)

Рекомендую посмотреть
http://sqlinfo.ru/articles/info/9.html

В статье приведены ограничения для версии MySQL 5.1 (в дальнейшем их число может сократиться).
# в определении представления нельзя использовать подзапрос в части FROM,

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson