Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: расписание на mysql  (Прочитано 69031 раз)
0 Пользователей и 7 Гостей смотрят эту тему.
Varlenka
Гость
« : 10-10-2003 10:37 » 

здравствуйте, подскажите как можно построить таблицу в mysql о занятости пользователей на неделю

отрезков времени 5 (8-10, 10-12, ...) с понедельника по пятницу
Записан
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #1 : 10-10-2003 10:48 » 

Ну например :
user_id, otrezok_id, day_id, otrezok
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 10-10-2003 10:51 » 

Предлогаю два варианта: можно хранить информацию о каждом отрезке в отдельной записи (на случай если отрезков со временем станет не 5), а можно о всех пяти в одной. Т.к. задача не практическая, а лабораторка, то лучше второй вариант - в одной строке.
Есть вопросы:
1) хранится будет информация только по одной неделе, или нет?
2) если одна неделя, то неделя календарная, или от сегодня + 6(7?) дней?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Varlenka
Гость
« Ответ #3 : 10-10-2003 10:52 » 

в смысле day_id?

пример таблицы

user_1 poned 8-10
user_1 poned 12-14
user_2 pjatn 12-14

что-то вроде того?
Записан
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #4 : 10-10-2003 10:56 » new

Цитата: Varlenka
в смысле day_id?


айди дня недели, понедельник(1)-пятница(5)
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
Varlenka
Гость
« Ответ #5 : 10-10-2003 11:06 » 

Цитата: RXL
Предлогаю два варианта: можно хранить информацию о каждом отрезке в отдельной записи (на случай если отрезков со временем станет не 5), а можно о всех пяти в одной. Т.к. задача не практическая, а лабораторка, то лучше второй вариант - в одной строке.


как раз не лабораторка. хранить информацию нужно только на неделю, причем рабочую. с понедельника по пятницу с 8 до 18

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


varlenka
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 10-10-2003 11:08 » 

Varlenka, ну а прочие вопросы? На одну неделю хранить или больше?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Varlenka
Гость
« Ответ #7 : 10-10-2003 11:28 » 

Цитата

1) хранится будет информация только по одной неделе, или нет?
2) если одна неделя, то неделя календарная, или от сегодня + 6(7?) дней?


Храниться информация о занятости должна только неделю, в начала каждой недели пользователь заполняет ее.

Причем неделя от понедельника до пятницы.
Записан
Varlenka
Гость
« Ответ #8 : 10-10-2003 11:30 » 

:?: Почему mysql выдает следующую ошибку при попытке создать базу:

access denied for user: '@localhost' to database
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 10-10-2003 11:37 » 

Предпочитаю все "лишние" данные задавать отдельной таблицей.
Код:
CREATE TABLE users (
  id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
/*   ^^^ 65535 юзеров, imho, хватит. Можно MEDIUMINT (~16M), или INT (~4Г) */
  f VARCHAR(32) NOT NULL,
  i VARCHAR(32) NOT NULL,
  o VARCHAR(32) NOT NULL
/* ^^^ ФИО */
  );

Если нужно знать просто план занятости:
Код:
CREATE TABLE business (
  user_id SMALLINT UNSIGNED NOT NULL,
  day_ enum('пн','вт','ср','чт','пт') NOT NULL,
  hour_ enum('8-10','10-12','12-14','14-16','16-18') NOT NULL,
  UNIQUE (user_id,day_,hour_)
  );
Для каждого пользователя может быть 0..25 записей о каждом периоде.
Или, немного изменив, можно хранить чем он занят в указаный период:
Код:
CREATE TABLE business (
  user_id SMALLINT UNSIGNED NOT NULL,
  day_ enum('пн','вт','ср','чт','пт') NOT NULL,
  hour_ enum('8-10','10-12','12-14','14-16','16-18') NOT NULL,
  task ... /* текстовое описание, ссылка на таблицу работ и т.п. */,
  UNIQUE (user_id,day_,hour_)
  );
Тут уже можно хранить как переменное число записей на каждого пользователя (как в предидущем варианте), так и все 25, а "пустые" часы соотв. помечать.
« Последнее редактирование: 20-11-2007 17:43 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 10-10-2003 11:39 » 

Цитата: Varlenka
:?: Почему mysql выдает следующую ошибку при попытке создать базу:

access denied for user: '@localhost' to database

Нет прав на CREATE TABLE...

Ты как root входишь, или как другой пользователь? СУБД твоя, или есть админ?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Varlenka
Гость
« Ответ #11 : 10-10-2003 11:44 » 

Спасибо, вроде понятно. Скорее буду хранить для каждого периода некую занятость.
Код:
UNIQUE (user_id,day_,hour_) 

что это означает?
« Последнее редактирование: 20-11-2007 17:44 от Алексей1153++ » Записан
Varlenka
Гость
« Ответ #12 : 10-10-2003 11:46 » 

Цитата: RXL

access denied for user: '@localhost' to database
нет прав на CREATE TABLE...

Ты как root входишь, или как другой пользователь? СУБД твоя, или есть админ?


Вроде должна как админ. Я же установила mysql себе на комп. Где нужно изменить настройки - в my.cnf Не понял
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 10-10-2003 12:16 » 

Цитата: Varlenka
Спасибо, вроде понятно. Скорее буду хранить для каждого периода некую занятость.
Код:
UNIQUE (user_id,day_,hour_) 

что это означает?
"Создать уникальный ключ из столбцов user_id, day_ и hour_". Это как поможет в поиске данных по юзеру (если строк будет много), так и автоматически проверяет чтобы небыло одинаковых строк, в которых совпадают одновременно все три указанных поля.

Цитата
Вроде должна как админ. Я же установила mysql себе на комп. Где нужно изменить настройки - в my.cnf Не понял
Нет. my.cfn - это настройка внутренних особенностей сервера. Они обычно пользователя не интересуют.
Существуют права доступа к серверу, базе, таблице и даже к конкретному столбцу, разрещения на определенные действия (создание базы, таблицы, select, insert, update и т.п.). Все это хранится в специальной ДБ с именем mysql. При изменении БД mysql стоит знать, что информация оттуда читается сервером однажды (при первом запросе), а далее хранится в памяти. Чтобы, изменив базу, заставить сервер перечитать таблицы запускаем команду FLUSH PRIVILEGES.

Ну это все "лирика" Ага Тут много что можно рассказать. Рекомендую на досуге почитать мануал.

Проблема отказа, быстрее всего, кроется в том, под каким пользователем ты входишь. Т.е., принудительно его указывать. Напр. "mysql -u root".
« Последнее редактирование: 20-11-2007 17:45 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Varlenka
Гость
« Ответ #14 : 10-10-2003 12:31 » 

как-то все-же надо изменить привилегии.
на команду mysql -u root выдается ошибка:(((
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 10-10-2003 12:38 » 

Какая ошибка? Приведи текст.

А как ты подключаешься к базе? Какой программой?
В какой операционке работаешь?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #16 : 10-10-2003 12:44 » 

Цитата: Varlenka
:?: Почему mysql выдает следующую ошибку при попытке создать базу:

access denied for user: '@localhost' to database

access denied for user: a user to kakoi ?'@localhost'


При инсталяции создаётся по дефолту юзер root со всеми правами.

Попробуй из скрипта законектиться так :
Код:
$link = mysql_connect("localhost", "root", "") or die ("Can't connect to server!");
if(!mysql_select_db("mysql", $link))
{
   print "Can't connect to the database<br />".mysql_error();
}
else
{
  print "Connected ...";
}
« Последнее редактирование: 20-11-2007 17:46 от Алексей1153++ » Записан

MCP, MCAD, MCTS:Win, MCTS:Web
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 10-10-2003 12:48 » 

MOPO3, есть еще анонимный вход. Строка "@localhost" говорит о попытке именно такого входа.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Varlenka
Гость
« Ответ #18 : 10-10-2003 12:48 » 

Цитата: RXL
Какая ошибка? Приведи текст.

А как ты подключаешься к базе? Какой программой?
В какой операционке работаешь?


Я работаю в XP, подключаюсь к SQL-серверу через mysqld.exe, потом
mysql.exe

Ошибка такая:

error 1044: Access denied for user: '@localhost' to database a;

Varlenka
Записан
Varlenka
Гость
« Ответ #19 : 10-10-2003 12:57 » 

Цитата
If you try to connect as root and get this error:
Access denied for user: '@unknown' to database mysql
this means that you don't have an entry in the user table with a User column value of 'root' and that mysqld cannot resolve the hostname for your client. In this case, you must restart the server with the --skip-grant-tables option and edit your `/etc/hosts' or `\windows\hosts' file to add an entry for your host.


подскажите, что это значит и где что нужно исправить?  Я шокирован!
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #20 : 10-10-2003 13:02 » 

mysqld.exe - это сервер,
mysql.exe - консольный клиент.

Вот как раз при запуске клиента нужно указать параметры подключения.
Список параметров можно получить так: mysql.exe --help

Вообще-то строки mysql.exe -u root должно хватить.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Varlenka
Гость
« Ответ #21 : 10-10-2003 13:04 » 

MOPO3,

результат Connected ...

а что дальше?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #22 : 10-10-2003 13:05 » 

Кстати, вспомнил - my.cfn тут все же причем. В нем в блоке начинающемся со строки [mysql] задаются параметры по умолчанию. Но все они перекрываются параметрами командной строки.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Varlenka
Гость
« Ответ #23 : 10-10-2003 13:09 » 

Цитата
Вот как раз при запуске клиента нужно указать параметры подключения.
Список параметров можно получить так: mysql.exe --help

Вообще-то строки mysql.exe -u root должно хватить.
Цитата


Вообще я нашла свою ошибку - не надо было в конце строки ставить ";"

На данный момент я зашла как mysql.exe -u root
и просматриваю таблицу привилегий
что-нибудь надо здесь сразу поменять или уже все ок?Улыбаюсь
Записан
Varlenka
Гость
« Ответ #24 : 10-10-2003 13:13 » 

Показываю язык  Спасибо за помощь!!!
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #25 : 10-10-2003 13:18 » 

Пока хватит root-а , а в будушем, если на сервер будет обращение с других компьютеров, то лучше будет создать другую, более ограниченную учетную запись.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Varlenka
Гость
« Ответ #26 : 10-10-2003 14:34 » 

Все сделала таким образом:
Код:
CREATE TABLE users ( 
  id INT(30) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(30), //LOGIN
  passwd_md5 VARCHAR,
 );

CREATE TABLE shedule (
  user_id INT(30) UNSIGNED NOT NULL,
  day_ enum('monday','tuesday','wednesday','thursday','friday') NOT NULL,
  hour_ enum('8-10','10-12','12-14','14-16','16-18') NOT NULL,
  notes TEXT,
  UNIQUE (user_id,day_,hour_)
  );

Но при вставке нового значение в shedule список начинается с 0. Почему так?
« Последнее редактирование: 20-11-2007 17:47 от Алексей1153++ » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #27 : 10-10-2003 18:36 » 

Разберу по частям и объясню ошибки...

Цитата: Varlenka
Все сделала таким образом:
Код:
CREATE TABLE users ( 
  id INT(30) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
INT(30) - тип INT имеет размер 32 бита и указывать после него в скобках больше чем 10 смысла нет
Цитата
Код:
  name VARCHAR(30), //LOGIN
  passwd_md5 VARCHAR,
тип VARCHAR требует указания максимального размера (0..255). Запятая поле - ошибка (возможно просто ошибка копирования в браузер )
Цитата
Код:
 );

CREATE TABLE shedule (
  user_id INT(30) UNSIGNED NOT NULL,
  day_ enum('monday','tuesday','wednesday','thursday','friday') NOT NULL,
  hour_ enum('8-10','10-12','12-14','14-16','16-18') NOT NULL,
  notes TEXT,
  UNIQUE (user_id,day_,hour_)
  );


Но при вставке нового значение в shedule список начинается с 0. Почему так?
Все правильно. Что вставляешь - то и получаешь. Т.е., я понимаю, ты вставляешь 0.
Следует дклать так:
1) при создании нового пользователя в users:
INSERT INTO users VALUES (0,"имя","пароль");
Т.е., вместо id я подставил 0. Но столбец имеет признаки AUTO_INCREMENT и PRIMARY KEY. Когда в такой столбец встабляешь 0, то реально вставляется полследнее запомненое максимальное знатение плюс один. Вставляя 0 мы можем получить новое уникальное значение.
Далее надо узнать это последнее вставленное знасение (замечу: последнее значение вставленное в процессе одного и того же соеинения!) В консоли mysql.exe это можно узнать через команду "SELECT LAST_INSERT_ID()". В php это будет "$id=mysql_insert_id($connection)". "$connection" - это то же самое что и "$link" в примере МОРОЗ-а.
После надо вставить строки, описывающие график работы этого пользователя в shedule. Пример:
INSERT INTO shedule VALUES (LAST_INSERT_ID(),'monday','8-10','иммитация бурной деятельности');


В итоге - создаем нового пользователя "без забот":
Код:
$name="карлсон";
$pass="день варения";
$con=mysql_connect("localhost","root");
mysql_select_db("твоя_база",$con);
if(!mysql_query($con,"INSERT users VALUES (0,'$name','$pass')")) {
  # такой пользователь уже существует
  print("ERROR: #".mysql_errno($con)." (".mysql_error($con).")\n");
  exit(1);
  }
$weeks=('monday','tuesday','wednesday','thursday','friday');
$hoors=('8-10','10-12','12-14','14-16','16-18');
$id=mysql_insert_id($con);
for($i=0;i<5;i++) {
for($j=0;i<5;i++) mysql_query("INSERT shedule VALUES ($id,'$weeks[$i]','$hoors[$j]','свободен до понедельника')");
}
mysql_close($con);

Далее можно через UPDATE изменять значение notes в каждой строчке по условию WHERE day_='$day' AND hour_='$hour' .
« Последнее редактирование: 20-11-2007 17:52 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Varlenka
Гость
« Ответ #28 : 12-10-2003 06:13 » 

спасибо
Записан
Varlenka
Гость
« Ответ #29 : 12-10-2003 06:24 » 

Код:
CREATE TABLE shedule ( 
  user_id INT(30) UNSIGNED NOT NULL,
  day_ enum('monday','tuesday','wednesday','thursday','friday') NOT NULL,
  hour_ enum('8-10','10-12','12-14','14-16','16-18') NOT NULL,
  notes TEXT,
  UNIQUE (user_id,day_,hour_)
  );

RXL, подскажите, пожалуйста, будет ли поиск проходить быстрее, если базу составить так:
Код:
CREATE TABLE shedule ( 
  user_id INT UNSIGNED NOT NULL,
  time_ enum('A','B','C','D','E',.....) NOT NULL, //и так все 25 промежутка
  notes TEXT,
  UNIQUE (user_id,time_)
  );
« Последнее редактирование: 20-11-2007 17:53 от Алексей1153++ » Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines