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

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

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

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

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

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

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

15
Почетный модератор
 Аватар для Humanoid
11553 / 4348 / 452
Регистрация: 12.06.2008
Сообщений: 12,453
10.06.2010, 08:31
Можно использовать YEAR(<поле с датой>)
Или лучше использовать DATE_ADD(<поле с датой>,INTERVAL <сколько лет> YEAR)
SQL
1
SELECT COUNT(*) FROM tab1 WHERE DATE_SUB(NOW(),INTERVAL 18 YEAR)>birthday;
1
 Аватар для acupation
67 / 67 / 6
Регистрация: 26.03.2010
Сообщений: 546
10.06.2010, 21:30  [ТС]
Спасибо. А если сделать статистику в режиме он-лайн? тоесть на данный момент зарегестрировано столько-то пользователей до 18, столько то от 18 до 23, от 23 и т.д.?
я представляю это примерно так:
PHP
1
$do18 = mysql_num_rows(mysql_query("SELECT `birth` FROM `person` WHERE `birth` = А тут"));
А вот что тут писать я не знаю)) Просто в поле "birth" записано именно вот так "1.1.1950", тоесть для исчисления возраста нужно использовать значение после 2 точек...
0
Почетный модератор
 Аватар для Humanoid
11553 / 4348 / 452
Регистрация: 12.06.2008
Сообщений: 12,453
10.06.2010, 21:43
Цитата Сообщение от 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
 Аватар для acupation
67 / 67 / 6
Регистрация: 26.03.2010
Сообщений: 546
10.06.2010, 21:47  [ТС]
да, именно varchar. Просто когда делал сайт, не задумывался и записывал для более легкого вывода. Спасибо.
Не заметил, так тут не отделено 3 значение
0
Почетный модератор
 Аватар для Humanoid
11553 / 4348 / 452
Регистрация: 12.06.2008
Сообщений: 12,453
10.06.2010, 22:16
Можешь переделать всё в 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
 Аватар для acupation
67 / 67 / 6
Регистрация: 26.03.2010
Сообщений: 546
10.06.2010, 22:46  [ТС]
В таком случае получилось, что дата отображается как год, месяц и день, правильно? или год день и месяц?
В общем получилось Остался вопрос, на сервере 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
 Аватар для romchiksoad
1957 / 796 / 89
Регистрация: 03.11.2009
Сообщений: 3,066
Записей в блоге: 2
10.06.2010, 23:15
Цитата Сообщение от 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
 Аватар для acupation
67 / 67 / 6
Регистрация: 26.03.2010
Сообщений: 546
10.06.2010, 23:21  [ТС]
Хотя я сделал. Сделал запрос наобщее кол-во пользователей и вычел из него получившиеся. Спасибо
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
 Аватар для romchiksoad
1957 / 796 / 89
Регистрация: 03.11.2009
Сообщений: 3,066
Записей в блоге: 2
10.06.2010, 23:25
acupation, жестко тогда надо еще "курить" по этому вопросу
0
Почетный модератор
 Аватар для Humanoid
11553 / 4348 / 452
Регистрация: 12.06.2008
Сообщений: 12,453
10.06.2010, 23:25
Наверное, знак надо не "больше", а "меньше"
....WHERE DATE_SUB(NOW(),INTERVAL 18 YEAR)<birth
0
 Аватар для acupation
67 / 67 / 6
Регистрация: 26.03.2010
Сообщений: 546
10.06.2010, 23:26  [ТС]
хм, хотя я заметил, что у меня статистика не правильная)
0
Почетный модератор
 Аватар для Humanoid
11553 / 4348 / 452
Регистрация: 12.06.2008
Сообщений: 12,453
10.06.2010, 23:28
И опять же не надо все строки выдергивать из таблицы, только для того, что бы их число посмотреть. Это очень не оптимально.
Если у тебя таблица 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
 Аватар для acupation
67 / 67 / 6
Регистрация: 26.03.2010
Сообщений: 546
10.06.2010, 23:38  [ТС]
MyISAM у меня. Я тут посмотрел... Он промежуток получается не счтает от и до, а берет чисто до.
До 18: 0
От 18 до 23: 0
От 23 до 30: 1
От 30 до 50: 1
После 50: 5

Как изменить интеррвал? через and?
0
Почетный модератор
 Аватар для Humanoid
11553 / 4348 / 452
Регистрация: 12.06.2008
Сообщений: 12,453
10.06.2010, 23:44
Можно построить немного по другому запрос:
SQL
1
.... WHERE birth BETWEEN DATE_SUB(NOW(),INTERVAL 24 YEAR) AND DATE_SUB(NOW(),INTERVAL 18 YEAR)
Тут будет считаться промежуток. Кому от 18 до 24 включительно.
Проблема будет только в том, случае, если кому-то в этот день исполнилось 18 лет (или любое другое пограничное количество лет)... тогда он отнесёт его к двум категориям.
1
 Аватар для acupation
67 / 67 / 6
Регистрация: 26.03.2010
Сообщений: 546
11.06.2010, 00:29  [ТС]
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.06.2010, 00:29
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru