powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сложная выборка
11 сообщений из 11, страница 1 из 1
Сложная выборка
    #32269726
Volant
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица посещений/переходов:

Код: plaintext
1.
2.
3.
4.
5.
id id2 datetime
 1    25    2003 - 09 - 18   23 : 00 : 28  
 2    50    2003 - 09 - 18   23 : 08 : 59  
 3    78    2003 - 09 - 18   23 : 10 : 05  
 4    55    2003 - 09 - 18   23 : 24 : 42 

и т.д. будет расти далее...

Хотелось бы получить следующее:
№ сент. октябрь
id2 кол-во переходов коло-во переходов
id2 кол-во переходов коло-во переходов
id2 кол-во переходов коло-во переходов

Надеюсь, понятно объяснил.

Если что не понятно - спрашивайте, постараюсь объяснить по-подробнее.
...
Рейтинг: 0 / 0
Сложная выборка
    #32269894
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объяснил ты конечно так себе

Примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT t.id2, count(t_sept.id2), count(t_oct.id2)
FROM
my_table t
  LEFT JOIN my_table t_sept on t.id2=t_sept.id2
  LEFT JOIN my_table t_oct on t.id2=t_oct.id2
WHERE
  t_sept.datetime BETWEEN '01.09.2003 00:00:00' AND '30.09.2003 23:59:59'  
AND
  t_oct.datetime BETWEEN '01.10.2003 00:00:00' AND '31.10.2003 23:59:59'  


mahoune
...
Рейтинг: 0 / 0
Сложная выборка
    #32269992
-Timka-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 mahoune

идея очень хорошая! (я не шучу и не иронизирую), но использовать count без group by нельзя (во всяком случае, моя версия сервера это не позволяет).
Да, и LEFT JOIN нужно наверное связывать по primary key, т.е. id, а не id2.
Я использовал ваш метод, слегка подправил и получил такой результат.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT t.id2,
       COUNT(IF(YEAR(t_sept.datetime) = YEAR(CURDATE()) AND
             MONTH(t_sept.datetime) =  9 , t_sept.datetime, NULL)) as september,

       COUNT(IF(YEAR(t_oct.datetime) = YEAR(CURDATE()) AND
             MONTH(t_oct.datetime) =  10 , t_oct.datetime, NULL))  as october
						 
FROM my_table t

  LEFT JOIN my_table t_sept on t.id=t_sept.id
  LEFT JOIN my_table t_oct on t.id=t_oct.id

group by t.id2



нетрудно проделать дальнейшую работу и сделать остальную часть для других месяцев.
а еще лучше заменить YEAR(CURDATE()) на переменную чтоб получить статистику по заданному году.


Как обычно - среда для опытов
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#
# Структура таблицы `my_table`
#

CREATE TABLE `my_table` (
  `id` int( 11 ) NOT NULL auto_increment,
  `id2` int( 11 ) NOT NULL default '0',
  `datetime` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT= 7  ;

#
# Дамп данных таблицы `my_table`
#

INSERT INTO `my_table` VALUES ( 1 ,  25 , '2003-09-18 23:00:28');
INSERT INTO `my_table` VALUES ( 2 ,  50 , '2003-09-18 23:08:59');
INSERT INTO `my_table` VALUES ( 3 ,  78 , '2003-09-18 23:10:05');
INSERT INTO `my_table` VALUES ( 4 ,  55 , '2003-09-18 23:24:42');
INSERT INTO `my_table` VALUES ( 5 ,  50 , '2003-09-18 13:08:59');
INSERT INTO `my_table` VALUES ( 6 ,  55 , '2003-10-19 10:00:00');
    


конечная табличка имеет вид (для вышеприведенного набора данных)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
  
id2  september  october  
 25         1           0  
 50         2           0  
 55         1           1  
 78         1           0  

...
Рейтинг: 0 / 0
Сложная выборка
    #32269998
-Timka-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:)
А если бы были бы вложенные запросы...
было бы одно удовольствие...
:)
...
Рейтинг: 0 / 0
Сложная выборка
    #32270206
Volant
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2-Timka-:

С вложенными запросами просто.

А когда пойдет ноябрь, мне еще один месяц добавлять в запрос придется?
...
Рейтинг: 0 / 0
Сложная выборка
    #32270232
-Timka-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо сразу все сделать, это нетрудно:
будет 12 LEFT JOIN (!)
и столько же IF.
...
Рейтинг: 0 / 0
Сложная выборка
    #32270430
Volant
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
Надо сразу все сделать, это нетрудно: 
будет  12  LEFT JOIN (!) 
и столько же IF.


Ага, и лет еще на пяток расписать?
...
Рейтинг: 0 / 0
Сложная выборка
    #32270547
-Timka-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:) у меня складывается впечатление, что разговариваю с юзером, а не программером :)
тебе нужна группировка по 12 сущностям - ее придется делать руками.
Сори, но динамический sql здесь не уместен.
Потом, если читал невнимательно, заменяешь выражение проверки года на переменную и у тебя универсальный запрос на любое количество лет...
...
Рейтинг: 0 / 0
Сложная выборка
    #32270584
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
оффтопик

-Timka-

позволь выразить тебе мое уважение, восхищение знаниями, пожелать терпения и надеюсь, что тебе не надоест это к пятистам постам ;)
...
Рейтинг: 0 / 0
Сложная выборка
    #32270670
-Timka-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 fedd

спасибо за теплые слова.
...
Рейтинг: 0 / 0
Сложная выборка
    #32270859
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
до меня тоьлко что дошло чего человек хочет ;)

но в mysql это сделать нельзя без того, чтобы 12 раз делать джоин, или собирать таблицу на клиенте.

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


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