Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
67 / 67 / 6
Регистрация: 26.03.2010
Сообщений: 546
1

Статистика пользователей по возрасту

10.06.2010, 03:12. Показов 1585. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, хотел бы сделать статустику пользователей по возросту. К примеру:
до 18 лет -
от 18 до 23 -
-----||-----
Проблема в том, что в поле дата рождения записана как "1.1.1950".
Вопрос вот в чем, как обработать базу так, чтобы он брал из неё только год, а не день, месяц и год. Просто точная статистика не нужна, нужна примерная. На теории это делается через split как я понял, вытаскивается год и минусуется из текущего, а дальше через if. Но как split прикрутить к запросу и после этого ещё сложить полученные результаты и предоставить не могу понять Помогите пожалуйста...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.06.2010, 03:12
Ответы с готовыми решениями:

Статистика пользователей - как идентифицировать пользователей с одинаковыми именами
есть 2 таблицы users, и item, в таблице item есть поле username, задача такова что бы вывести...

Как провести сортировку после выбора данных пользователей по возрасту?
Подскажите пожалуйста,как мне провести сортировку именно по тем данным которые были выбранны а не...

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

Статистика пользователей: показывать, сколько пользователей работают сейчас в программе
доброго времени суток! как сделать статистику пользователей для своей программы как в скайпе? ...

15
Почетный модератор
11525 / 4320 / 448
Регистрация: 12.06.2008
Сообщений: 12,412
10.06.2010, 08:31 2
Можно использовать YEAR(<поле с датой>)
Или лучше использовать DATE_ADD(<поле с датой>,INTERVAL <сколько лет> YEAR)
SQL
1
SELECT COUNT(*) FROM tab1 WHERE DATE_SUB(NOW(),INTERVAL 18 YEAR)>birthday;
1
67 / 67 / 6
Регистрация: 26.03.2010
Сообщений: 546
10.06.2010, 21:30  [ТС] 3
Спасибо. А если сделать статистику в режиме он-лайн? тоесть на данный момент зарегестрировано столько-то пользователей до 18, столько то от 18 до 23, от 23 и т.д.?
я представляю это примерно так:
PHP
1
$do18 = mysql_num_rows(mysql_query("SELECT `birth` FROM `person` WHERE `birth` = А тут"));
А вот что тут писать я не знаю)) Просто в поле "birth" записано именно вот так "1.1.1950", тоесть для исчисления возраста нужно использовать значение после 2 точек...
0
Почетный модератор
11525 / 4320 / 448
Регистрация: 12.06.2008
Сообщений: 12,412
10.06.2010, 21:43 4
Цитата Сообщение от acupation Посмотреть сообщение
Просто в поле "birth" записано именно вот так "1.1.1950", тоесть для исчисления возраста нужно использовать значение после 2 точек
Не понял... это не в виде DATE, а просто текст? CHAR или VARCHAR какой-то? Это будет гораздо сложнее и будет работать гораздо медленнее.
Цитата Сообщение от acupation Посмотреть сообщение
$do18 = mysql_num_rows(mysql_query(
Старайся не использовать такие конструкции. Лучше сделать
PHP
1
2
$res = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person WHERE DATE_SUB(NOW(),INTERVAL 18 YEAR)>birth"));
$do18 = $res[0];
Тут мускул сам считает количество строк и возвращает только число. А в твоём примере он отправит все эти строки скрипту, хотя они сами и не нужны... будут только время и память отнимать.
1
67 / 67 / 6
Регистрация: 26.03.2010
Сообщений: 546
10.06.2010, 21:47  [ТС] 5
да, именно varchar. Просто когда делал сайт, не задумывался и записывал для более легкого вывода. Спасибо.
Не заметил, так тут не отделено 3 значение
0
Почетный модератор
11525 / 4320 / 448
Регистрация: 12.06.2008
Сообщений: 12,412
10.06.2010, 22:16 6
Можешь переделать всё в DATE... выполни по очереди 3 такие запроса
SQL
1
2
3
ALTER TABLE person ADD COLUMN tmp DATE NOT NULL;
UPDATE person SET tmp=CONCAT(SUBSTRING_INDEX(birth,'.',-1),'-',SUBSTRING_INDEX(SUBSTRING_INDEX(birth,'.',2),'.',-1),'-',SUBSTRING_INDEX(birth,'.',1));
ALTER TABLE person CHANGE COLUMN birth oldbirth VARCHAR(20) NOT NULL,CHANGE tmp birth DATE NOT NULL,ADD INDEX(birth);
Потом проверь... старый текстовый столбец будет назваться oldbirth... а новый в формате DATE будет на его месте - birth. Если все даты перевелись правильно, то старый можешь удалить
SQL
1
ALTER TABLE person DROP COLUMN oldbirth;
1
67 / 67 / 6
Регистрация: 26.03.2010
Сообщений: 546
10.06.2010, 22:46  [ТС] 7
В таком случае получилось, что дата отображается как год, месяц и день, правильно? или год день и месяц?
В общем получилось Остался вопрос, на сервере 5 человек, сделал так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   $res = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person WHERE DATE_SUB(NOW(),INTERVAL 18 YEAR)>birth"));
$do18 = $res[0];
   $res1 = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person WHERE DATE_SUB(NOW(),INTERVAL 23 YEAR)>birth"));
$do23 = $res1[0];
   $res2 = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person WHERE DATE_SUB(NOW(),INTERVAL 30 YEAR)>birth"));
$do30 = $res2[0];
   $res3 = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person WHERE DATE_SUB(NOW(),INTERVAL 50 YEAR)>birth"));
$do50 = $res3[0];
   $res4 = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person WHERE DATE_SUB(NOW(),INTERVAL 100 YEAR)>birth"));
$ot50 = $res4[0];
 
    print "<br>До 18: <b>".$do18."</b>";
    print "<br>От 18 до 23: <b>".$do23."</b>";
    print "<br>От 23 до 30: <b>".$do30."</b>";
    print "<br>От 30 до 50: <b>".$do50."</b>";
    print "<br>После 50: <b>".$ot50."</b>";
Если так, то выводит:
До 18: 5
От 18 до 23: 5
От 23 до 30: 4
От 30 до 50: 4
После 50: 0
Хотя до 18 Нет пользователей
0
1957 / 796 / 89
Регистрация: 03.11.2009
Сообщений: 3,066
Записей в блоге: 2
10.06.2010, 23:15 8
Цитата Сообщение от acupation Посмотреть сообщение
В таком случае получилось, что дата отображается как год, месяц и день, правильно? или год день и месяц?
ГГГГММДД - год месяц день, если память не изменяет
А по поводу запроса, попробуйте так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$res = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person WHERE DATE_SUB(NOW(),INTERVAL -18 YEAR)>birth"));
$do18 = $res[0];
   $res1 = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person WHERE DATE_SUB(NOW(),INTERVAL -23 YEAR)>birth"));
$do23 = $res1[0];
   $res2 = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person WHERE DATE_SUB(NOW(),INTERVAL -30 YEAR)>birth"));
$do30 = $res2[0];
   $res3 = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person WHERE DATE_SUB(NOW(),INTERVAL -50 YEAR)>birth"));
$do50 = $res3[0];
   $res4 = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person WHERE DATE_SUB(NOW(),INTERVAL -100 YEAR)>birth"));
$ot50 = $res4[0];
 
    print "<br>До 18: <b>".$do18."</b>";
    print "<br>От 18 до 23: <b>".$do23."</b>";
        print "<br>От 23 до 30: <b>".$do30."</b>";
        print "<br>От 30 до 50: <b>".$do50."</b>";
        print "<br>После 50: <b>".$ot50."</b>";
?>
Если я правильно разобрался, то это должно работать
0
67 / 67 / 6
Регистрация: 26.03.2010
Сообщений: 546
10.06.2010, 23:21  [ТС] 9
Хотя я сделал. Сделал запрос наобщее кол-во пользователей и вычел из него получившиеся. Спасибо
romchiksoad, В твоем случае он показывает вот так:
До 18: 5
От 18 до 23: 5
От 23 до 30: 5
От 30 до 50: 5
После 50: 5
Я сделал вот так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$kol = mysql_num_rows(mysql_query("SELECT `id` FROM `person`"));
   $res = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person WHERE DATE_SUB(NOW(),INTERVAL 18 YEAR)>birth"));
$do18 = $kol - $res[0];
   $res1 = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person WHERE DATE_SUB(NOW(),INTERVAL 23 YEAR)>birth"));
$do23 = $kol - $res1[0];
   $res2 = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person WHERE DATE_SUB(NOW(),INTERVAL 30 YEAR)>birth"));
$do30 = $kol - $res2[0];
   $res3 = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person WHERE DATE_SUB(NOW(),INTERVAL 50 YEAR)>birth"));
$do50 = $kol - $res3[0];
   $res4 = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person WHERE DATE_SUB(NOW(),INTERVAL 100 YEAR)>birth"));
$ot50 = $kol - $res4[0];
    print "<br>До 18: <b>".$do18."</b>";
    print "<br>От 18 до 23: <b>".$do23."</b>";
    print "<br>От 23 до 30: <b>".$do30."</b>";
    print "<br>От 30 до 50: <b>".$do50."</b>";
    print "<br>После 50: <b>".$ot50."</b>";
Добавлено через 4 минуты
А если ещё сделать в % соотношении то так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$kol = mysql_num_rows(mysql_query("SELECT `id` FROM `person`"));
   $res = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person WHERE DATE_SUB(NOW(),INTERVAL 18 YEAR)>birth"));
$do18 = $kol - $res[0];
   $res1 = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person WHERE DATE_SUB(NOW(),INTERVAL 23 YEAR)>birth"));
$do23 = $kol - $res1[0];
   $res2 = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person WHERE DATE_SUB(NOW(),INTERVAL 30 YEAR)>birth"));
$do30 = $kol - $res2[0];
   $res3 = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person WHERE DATE_SUB(NOW(),INTERVAL 50 YEAR)>birth"));
$do50 = $kol - $res3[0];
   $res4 = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person WHERE DATE_SUB(NOW(),INTERVAL 100 YEAR)>birth"));
$ot50 = $kol - $res4[0];
$dor18 = ($do18/$kol)*100;
$dor23 = ($do23/$kol)*100;
$dor30 = ($do30/$kol)*100;
$dor50 = ($do50/$kol)*100;
$otr50 = ($ot50/$kol)*100;
 
 
    echo "Соотношение в %:";
 
    print "<br>До 18: <b>".$dor18."%</b>";
    print "<br>От 18 до 23: <b>".$dor23."%</b>";
    print "<br>От 23 до 30: <b>".$dor30."%</b>";
    print "<br>От 30 до 50: <b>".$dor50."%</b>";
    print "<br>После 50: <b>".$otr50."%</b>";
 
    echo "<br><br><br>Соотношение в кол-ве:";
 
    print "<br>До 18: <b>".$do18."</b>";
    print "<br>От 18 до 23: <b>".$do23."</b>";
    print "<br>От 23 до 30: <b>".$do30."</b>";
    print "<br>От 30 до 50: <b>".$do50."</b>";
    print "<br>После 50: <b>".$ot50."</b>";
Теперь показывает:
Соотношение в %:
До 18: 0%
От 18 до 23: 0%
От 23 до 30: 20%
От 30 до 50: 20%
После 50: 100%


Соотношение в кол-ве:
До 18: 0
От 18 до 23: 0
От 23 до 30: 1
От 30 до 50: 1
После 50: 5

Все как я и хотел. Спасибо
0
1957 / 796 / 89
Регистрация: 03.11.2009
Сообщений: 3,066
Записей в блоге: 2
10.06.2010, 23:25 10
acupation, жестко тогда надо еще "курить" по этому вопросу
0
Почетный модератор
11525 / 4320 / 448
Регистрация: 12.06.2008
Сообщений: 12,412
10.06.2010, 23:25 11
Наверное, знак надо не "больше", а "меньше"
....WHERE DATE_SUB(NOW(),INTERVAL 18 YEAR)<birth
0
67 / 67 / 6
Регистрация: 26.03.2010
Сообщений: 546
10.06.2010, 23:26  [ТС] 12
хм, хотя я заметил, что у меня статистика не правильная)
0
Почетный модератор
11525 / 4320 / 448
Регистрация: 12.06.2008
Сообщений: 12,412
10.06.2010, 23:28 13
И опять же не надо все строки выдергивать из таблицы, только для того, что бы их число посмотреть. Это очень не оптимально.
Если у тебя таблица MyISAM, то можно
PHP
1
2
   $res = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person"));
$kol = $res[0];
Если InnoDB, но звёздочку указывать будет плохо... тогда надо по id считать.
PHP
1
2
   $res = mysql_fetch_row(mysql_query("SELECT COUNT(id) FROM person"));
$kol = $res[0];
0
67 / 67 / 6
Регистрация: 26.03.2010
Сообщений: 546
10.06.2010, 23:38  [ТС] 14
MyISAM у меня. Я тут посмотрел... Он промежуток получается не счтает от и до, а берет чисто до.
До 18: 0
От 18 до 23: 0
От 23 до 30: 1
От 30 до 50: 1
После 50: 5

Как изменить интеррвал? через and?
0
Почетный модератор
11525 / 4320 / 448
Регистрация: 12.06.2008
Сообщений: 12,412
10.06.2010, 23:44 15
Можно построить немного по другому запрос:
SQL
1
.... WHERE birth BETWEEN DATE_SUB(NOW(),INTERVAL 24 YEAR) AND DATE_SUB(NOW(),INTERVAL 18 YEAR)
Тут будет считаться промежуток. Кому от 18 до 24 включительно.
Проблема будет только в том, случае, если кому-то в этот день исполнилось 18 лет (или любое другое пограничное количество лет)... тогда он отнесёт его к двум категориям.
1
67 / 67 / 6
Регистрация: 26.03.2010
Сообщений: 546
11.06.2010, 00:29  [ТС] 16
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    echo"<a href=index.php?act=stat><b><u>на главную</u></b></a><br><br>";
   $ko = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person"));
$kol = $ko[0];
   $res = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person WHERE DATE_SUB(NOW(),INTERVAL 18 YEAR)<birth"));
$do18 = $res[0];
   $res1 = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person WHERE birth BETWEEN DATE_SUB(NOW(),INTERVAL 23 YEAR) AND DATE_SUB(NOW(),INTERVAL 18 YEAR)"));
$do23 = $res1[0];
   $res2 = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person WHERE birth BETWEEN DATE_SUB(NOW(),INTERVAL 30 YEAR) AND DATE_SUB(NOW(),INTERVAL 24 YEAR)"));
$do30 = $res2[0];
   $res3 = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person WHERE birth BETWEEN DATE_SUB(NOW(),INTERVAL 50 YEAR) AND DATE_SUB(NOW(),INTERVAL 31 YEAR)"));
$do50 = $res3[0];
   $res4 = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM person WHERE DATE_SUB(NOW(),INTERVAL 51 YEAR)>birth"));
$ot50 = $res4[0];
$dor18 = ($do18/$kol)*100;
$dor23 = ($do23/$kol)*100;
$dor30 = ($do30/$kol)*100;
$dor50 = ($do50/$kol)*100;
$otr50 = ($ot50/$kol)*100;
 
 
    echo "Соотношение в %:";
 
    print "<br>До 18: <b>".$dor18."%</b>";
    print "<br>От 18 до 23: <b>".$dor23."%</b>";
    print "<br>От 23 до 30: <b>".$dor30."%</b>";
    print "<br>От 30 до 50: <b>".$dor50."%</b>";
    print "<br>После 50: <b>".$otr50."%</b>";
 
    echo "<br><br><br>Соотношение в кол-ве:";
 
    print "<br>До 18: <b>".$do18."</b>";
    print "<br>От 18 до 23: <b>".$do23."</b>";
    print "<br>От 23 до 30: <b>".$do30."</b>";
    print "<br>От 30 до 50: <b>".$do50."</b>";
    print "<br>После 50: <b>".$ot50."</b>";
Все вроде встало на свои места. Спасибо
0
11.06.2010, 00:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.06.2010, 00:29
Помогаю со студенческими работами здесь

статистика пользователей и роботов
подскажите каким образом сделать статистику , тоесть к примеру - сейчас на сайте 5 гостей , 3...

Статистика Пользователей PHP
Необходимо сделать статистику по залогинившимся пользователям. Вся информация записывается в лог...

Статистика времени работы пользователей
Здравствуйте, есть домен, в нем сервер на Windows 2012 R2 Datacenter, и примерно 100 пользователей....

Статистика работы пользователей с базой
Вечер добрый. Задумал собрать статистику работы пользователей в базе. Создать некую диаграмму...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru