Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

статистика

271
09 ноября 2005 года
MrXaK
721 / / 31.12.2002
есть некоторые записи в бд... и по ним надо вывести статистику за месяц... (имеется в виду по дате помещения в бд, поле хранит time() времени записи)
как сделать?
пока ничего умнее, чем с помощью date() определить текущий год и месяц, а потом через mktime() получить время на начало месяца и потом выбрать из бд те записи, в которых соответсвтующее поле больше полученного времени, не придумал...
а можно по-другому как-нить?
тока плз не предлагайте хранить время записи в другом формате...
239
09 ноября 2005 года
Dolonet
1.7K / / 20.05.2000
Цитата:
Originally posted by Mr.Hacker
есть некоторые записи в бд... и по ним надо вывести статистику за месяц... (имеется в виду по дате помещения в бд, поле хранит time() времени записи)
как сделать?
пока ничего умнее, чем с помощью date() определить текущий год и месяц, а потом через mktime() получить время на начало месяца и потом выбрать из бд те записи, в которых соответсвтующее поле больше полученного времени, не придумал...
а можно по-другому как-нить?
тока плз не предлагайте хранить время записи в другом формате...

Не ясно что хранится в БД (статистика чего?) и что хочется на выходе. В MySQL есть два типа полей, которые ничуть не хуже time, а именно DATETIME и TIMESTAMP.

271
09 ноября 2005 года
MrXaK
721 / / 31.12.2002
Цитата:
Originally posted by Dolonet
Не ясно что хранится в БД (статистика чего?) и что хочется на выходе. В MySQL есть два типа полей, которые ничуть не хуже time, а именно DATETIME и TIMESTAMP.


в принципе не важно что хранится.. просто есть таблица с некоторыми полями одно из которых дата, а по одному из остальных выводится критерий статистики...
просто если буду тип переделывать - мне там менять много чего прийдётся... поэтому надо с time()
в принципе реализовал как написал

 
Код:
$month = date("n");
$year = date("Y");
$t = mktime(0, 0, 0, $month, 0, $year)
// SELECT COUNT(*)....WHERE datedob > $t

просто думаю будет ли это быстро работать при больших размерах бд (так как это дело повторяется в цикле для каждого поля критерия статистики....
239
09 ноября 2005 года
Dolonet
1.7K / / 20.05.2000
Цитата:
Originally posted by Mr.Hacker
в принципе не важно что хранится.. просто есть таблица с некоторыми полями одно из которых дата, а по одному из остальных выводится критерий статистики...
просто если буду тип переделывать - мне там менять много чего прийдётся... поэтому надо с time()
в принципе реализовал как написал
 
Код:
$month = date("n");
$year = date("Y");
$t = mktime(0, 0, 0, $month, 0, $year)
// SELECT COUNT(*)....WHERE datedob > $t

просто думаю будет ли это быстро работать при больших размерах бд (так как это дело повторяется в цикле для каждого поля критерия статистики....

Приведи в теге PHP или CODE весь текст, относящийся к статистике. Тогда я смогу сказать как это обобщить запросом. По крайней мере постараюсь.

А сколько раз это повторится в цикле?

271
09 ноября 2005 года
MrXaK
721 / / 31.12.2002
Цитата:
Originally posted by Dolonet
Приведи в теге PHP или CODE весь текст, относящийся к статистике. Тогда я смогу сказать как это обобщить запросом. По крайней мере постараюсь.

А сколько раз это повторится в цикле?


ну хз как привести текст относящийся к статистике...
сейчас попробую показать как всё происходит...
таблица aaaa
поле id
остальные поля неважны

таблица bbbb
поле id
поле parent - связано с aaaa.id
поле datedob - дата добавления записи
остальные поля неважны

вот нужна статистика - сколько в таблице bbbb полей каждого типа aaaa (aaaa.id = bbbb.parent) и сколько полей каждого типа добавлено за последний месяц...

то есть в цикле выборки (так как время начала месяца-то будет общее) будет столько запросов сколько записей в aaaa
могу только сказать, что записей в aaaa не больше десятков...
а в bbbb порядка >10k записей...
c JOINами для подсчёта не разобрался... поэтому пришлось вот так вот в цикле делать...

239
09 ноября 2005 года
Dolonet
1.7K / / 20.05.2000
Сейчас покажу как это делается. Все просто. Надо действительно работать c JOIN-ом, но с определенным и правильно группировать. Текст запроса получится примерно таким:
 
Код:
SELECT a.id AS id, a.name AS name, COUNT(b.id) AS lastmonth
FROM aaaa a
LEFT JOIN bbbb b ON b.parent=a.id AND b.datedob>=$your_datedob
GROUP BY a.id
ORDER BY name

Я симпровизировал и добавил в табличку aaaa поле, по которому захочется сортировать. Все просто, сделано одним скриптом. Подходит?
271
10 ноября 2005 года
MrXaK
721 / / 31.12.2002
суперски... работает, пасиба...
правда на скорость не тестил... ну да ладно...
239
10 ноября 2005 года
Dolonet
1.7K / / 20.05.2000
Цитата:
Originally posted by Mr.Hacker
суперски... работает, пасиба...
правда на скорость не тестил... ну да ладно...

Протестируй, ты разницы не заметишь, т.к. это всего один лефт джоин. Если хочешь реально очень высокой скорости, создай простой индекс по полю bbbb.parent или как там его. Тогда сможешь работать с 100M, а не 10k, того не замечая.

271
10 ноября 2005 года
MrXaK
721 / / 31.12.2002
ясна...

такс, терь надо усложнить задачу... попробую описать...
таблица aaaa
поле id
остальные поля неважны

таблица bbbb
поле id
поле parent - связано с aaaa.id
поле razd - связано с cccc.id
поле datedob - дата добавления записи
остальные поля неважны

таблица cccc
поле id
поле parent - cccc.id
остальные поля неважны

в-общем так, таблица cccc - разделы... с древовидной структурой...
записи в bbbb - связаны с cccc (по полю razd)
надо вывести так же статистику по aaaa.id но для каждого cccc.id и cccc.parent = 0 с учётом всех подразделов cccc
я рекурсией делал спуск по дереву cccc и потом просто складываются все...
может тоже быстрее можно?
239
10 ноября 2005 года
Dolonet
1.7K / / 20.05.2000
Если иерархия ограничена, например, тремя уровнями, то можно сделать тоже одним запросом. Привести, или нужна именно рекурсия?
271
10 ноября 2005 года
MrXaK
721 / / 31.12.2002
Цитата:
Originally posted by Dolonet
Если иерархия ограничена, например, тремя уровнями, то можно сделать тоже одним запросом. Привести, или нужна именно рекурсия?


по идее вложенность неограничена, но на практике больше 1-2х вложения не будет по идее... приведи плз...

239
10 ноября 2005 года
Dolonet
1.7K / / 20.05.2000
Цитата:
Originally posted by Mr.Hacker
по идее вложенность неограничена, но на практике больше 1-2х вложения не будет по идее... приведи плз...

Ваша задача алогична, т.к. если мы сохраняем связку в запросе между aaaa и bbbb, то у нас получается ошибка в самой логике запроса. Попробуйте описать ситуацию еще раз. Или я что-то не понимаю...

271
10 ноября 2005 года
MrXaK
721 / / 31.12.2002
тут в этой ситуации ещё одна связка, даже 2... надо вывести сколько в таблице bbbb полей видов aaaa, которые относятся к разделам cccc и их подразделам....
в-общем, есть разделы, подразделы (cccc)... в них помещаются заявки (bbbb) разных видов (aaaa)... вот надо по каждому разделу с учётом подразделов вывести статистику....
271
10 ноября 2005 года
MrXaK
721 / / 31.12.2002
см рисунок... там некоторые лишние, не стал убирать...
надо вывести статистику сколько предложений (лотов) каждого из типов предложения в каждом из разделов включая подразделы (родительский fk) было всего и сколько из этого за месяц... типы товара не важны... остальные таблицы тоже...

вот говорю что в принципе в разделах подразделов не больше 2х...
239
10 ноября 2005 года
Dolonet
1.7K / / 20.05.2000
Итак, пробуем делать по шагам.

1. Выведем сколько товаров bbbb в каждом корневом каталоге cccc WHERE cccc.parent=0
 
Код:
SELECT c.id, c.name, COUNT(b.id)
FROM bbbb b
INNER JOIN cccc c ON c.id=b.parent AND c.parent=0
GROUP BY b.id

2. Выводим то же самое для каждого парента, но с учетом двух уровней подкаталогов
 
Код:
SELECT c.id, c.name, COUNT(b.id)
FROM cccc c
LEFT JOIN bbbb b ON b.parent=c.id
LEFT JOIN cccc d ON d.parent=c.id
LEFT JOIN bbbb e ON e.parent=d.id
LEFT JOIN cccc f ON f.parent=d.id
LEFT JOIN bbbb g ON g.parent=f.id
LEFT JOIN cccc h ON h.parent=f.id
WHERE c.parent=0
GROUP BY c.id
(да, в первом я, кажется, намудрил, ну хоть второй выглядит нормально)

3. Теперь работаем не с cccc, а aaaa (прошу прощения за тавтологию)... И ничего не получается..
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог