Автоматизация библиотеки. Как правильно написать запрос?

AndySharton

Новичок
Автоматизация библиотеки. Как правильно написать запрос?

Здравствуйте. Подскажите, пожалуйста.
Есть три таблицы:
1) title

-- Структура таблицы `Title`
--

CREATE TABLE `Title` (
`id` int(11) NOT NULL auto_increment,
`barcode` int(11) default NULL,
`title` varchar(30) default NULL,
`subtitle` varchar(20) default NULL,
`authors` varchar(30) default NULL,
`editions` varchar(20) default NULL,
`lccn` varchar(20) default NULL,
`isbn` varchar(20) default NULL,
`issn` varchar(20) default NULL,
`m_type` int(3) default NULL,
`author` varchar(30) default NULL,
`a_dates` varchar(20) default NULL,
`pub_place` varchar(30) default NULL,
`pub_publisher` varchar(30) default NULL,
`pub_date` date default NULL,
`price` float NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `barcode` (`barcode`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;

--

2) Patron


-- Структура таблицы `patron`
--

CREATE TABLE `patron` (
`id` bigint(10) NOT NULL,
`barcode` bigint(10) NOT NULL,
`lname` varchar(255) NOT NULL,
`fname` varchar(255) NOT NULL,
`otch` varchar(255) NOT NULL,
`nik` varchar(255) NOT NULL,
`gender` enum('male','famale') default NULL,
`add1` varchar(255) NOT NULL,
`add2` varchar(255) NOT NULL,
`city` varchar(255) NOT NULL,
`zip` varchar(255) NOT NULL,
`country` varchar(255) NOT NULL,
`phone` varchar(255) NOT NULL,
`email1` varchar(255) NOT NULL,
`email2` varchar(255) NOT NULL,
`grade` varchar(255) NOT NULL,
`birthdate` date NOT NULL,
`graddate` date NOT NULL,
`comment` varchar(255) NOT NULL,
UNIQUE KEY `id` (`id`),
UNIQUE KEY `barcode` (`barcode`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

--

Circulation-- Структура таблицы `circulation`
--

CREATE TABLE `circulation` (
`patron_id` int(11) NOT NULL,
`book_id` int(11) NOT NULL,
`status` enum('hold','out','back') default NULL,
`cdate` datetime default '0000-00-00 00:00:00',
KEY `patron_id` (`patron_id`,`book_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 ROW_FORMAT=FIXED;

--

Я пытаюсь автоматизировать библиотеку. В таблицу title заносятся книги. В таблицу patron читатели. А в таблице circulation ведется запись: когда читатель взял книгу? Когда сдал назад в библиотеку. Читатель может забронировать книгу.

Весь вопрос в том что я что-то ума не приложу как написать запрос, который делает запись в таблицу circulation. Может, у кого будут варианты? Пожалуйста, помогите?

Если будут идеи по написанию скрипта для этого дела на php, то я вообще буду безгранично счастлив.
Идея такая: библиотекарь находит читателя, затем находит книгу. И книга добавляется в карточку читателя.
При сдаче книги в таблице circulation заводится запись о том, что книга сдана.
 

Gremboloid

инженера Гр...
IMHO нет смысла разбивать операцию взял-сдал на отдельные записи, в Circulation нужно поле когда выдали книгу, поле когда сдали книгу и поле признак выдана на руки для брони.
 

Фанат

oncle terrible
Команда форума
а какая проблема с запросом?
это жа такой же запрос, как на добавление книги или читателя. в чем конкретно проблема?
и, я соглашусь, что для статистики лучше писать обе даты.
только с бронированием не очень пока понятно.
 

nirex

Новичок
Gremboloid
есть смысл, структура события не может содержать в себе еще одно
Если делать отдельно будет проще собирать разные отчеты и главное все по одному полю события, а не по двум и индекс только один понадобится.

AndySharton
Приложись к справочному пособию, чтобы понимать что да как, вопрос твой прост. Читать в сторону sql INSERT
 

Gremboloid

инженера Гр...
nirex не путай хранение информации о выданных книгах и системы логов событий. это совсем разные задачи.
 

nirex

Новичок
prolis
написать запрос не проблема, но конечно при большом количестве евентов будет притормаживать, но это дело оптимизации, и тут всего лишь надо добавить поле circulation_id в таблицу Title чтобы получать текущий статус книги
 

AndySharton

Новичок
Сейчас я уже сделал кое-что по этой теме. И меня волнует такой вопрос:

Как правильно передать вместе с формой значение переменной полученное ранее из базы данных на другую страницу?

Вот кусок моего кода:

PHP:
//Какое-то значение patron_id полученое ранее.  
//В данном случае я просто присвою это значение переменной. 
patron_id=5;  
//Далее форма  
echo "<form action=\"find_title.php\" method=\"post\"> 
<input name=\"barcode\" type=\"text\" />  
<input name=\"chk_out_btn\" type=\"Submit\" value=\"Найти\" />  </form>";
Я прочитал что значения можно передавать вместе с формой используя
<input name="" type="hidden" value="" /> .
Но как прописывать переменную patron_id в value?
 

AndySharton

Новичок
Нет. Конечно знаю.
Я уже разобрался насчет своего вопроса. Оказовается достаточно было написать так: ".$id_patron."
Все можно закрывать тему.
Всем кто хотел помочь - огромное спасибо!
 

Фанат

oncle terrible
Команда форума
Молодец. похвально, что ты стараешься разобраться самостоятельно.
А тему закрывать еще рано. Я думаю, вопросы у тебя еще появятся :)
 

AndySharton

Новичок
Действительно вопрос появился!!! :)

Как можно вывести из таблицы circulation patron_id у которого мне известен book_id, status, но чтобы дата была самая последняя?

Я написал запрос но он не правильно работает. Может поможите?

SELECT patron_id, tbarcode, MAX( cdate )
FROM circulation
WHERE tbarcode = "5"
AND `circulation`.`status` = "ch_out"
GROUP BY patron_id, tbarcode
LIMIT 0 , 30

Как вообще выводить запись у которой дата самая последняя?
 

AndySharton

Новичок
Спасибо бльшое. Самое интересное - это то, что как только я напишу на форум - я сам вдруг понимаю как мне что сделать. :)
Посмотрите мой запрос:
Допустим что номер баркода = 5

Код:
SELECT patron_id, tbarcode, MAX(cdate)
FROM `circulation` WHERE tbarcode ="5" and cdate = (SELECT  MAX(cdate) FROM `circulation` WHERE tbarcode ="5" AND `circulation`.`status` = "ch_in")
GROUP BY patron_id, tbarcode
Наверно черезчур сложно написан?
Но тоже работает.
 

prolis

Новичок
AndySharton, если бы ты послушал Gremboloid, то жизнь не казалась бы такой как секс стоя в гамаке:
[sql]
SELECT patron_id, tbarcode, cdate
FROM `circulation` WHERE tbarcode ="5" and cdate_in* is null
[/sql]
*cdate_in - дата возврата
 

AndySharton

Новичок
Пожалуйста скажите, как можно вывести результат запроса в виде нормально оформленной таблицы?
Я перечитал кучу всего, но не смог найти.
В большинстве источников говориться, как вывести результат запроса типа
PHP:
SELECT * FROM table

Мне нужно чтобы можно было выводить типа
PHP:
SELECT title, barcode, author FROM Title
Или запрос выводящий поля из двух и более таблиц.

Как это сделать?
Можно чтобы шапка таблицы была на русском?

-~{}~ 06.06.09 16:16:

Я нашел один способ, но опять же он работает только для вывода всех полей
PHP:
$conn = mysql_connect("localhost", "root", ""); // настройка подключения к БД
$database = "mylib";
$table_name = "Title";
switch($rep_type) // переключающее выражение
{
 case 1: // константное выражение 1
   
  mysql_select_db($database);
  $list_f = mysql_list_fields($database, $table_name);
  $n1 = mysql_num_fields($list_f);
  // сохраним имена полей в массиве $names
  for($j = 0; $j < $n1; $j++) $names[] = mysql_field_name($list_f, $j);
  // создаем SQL запрос
  $sql = "SELECT * FROM $table_name";
  // отправляем запрос на сервер
  $q = mysql_query($sql, $conn) or die();
  // получаем число строк результата
  $n = mysql_num_rows($q);
  //рисуем HTML-таблицу
  echo <<<EOT
<h2>$table_name</h2>
<table  width=90%  align=center class=rep>
EOT;
  // отображаем названия полей
  echo "<tr>\n";
  foreach($names as $val) echo "<th align=center bgcolor='#C2E3B6'><font size=2>$val</font></th>\n";
  echo "</tr>\n";
  // отображаем значения полей
  for($i = 0;$i < $n; $i++)
  { // перебираем все строки в результате запроса на выборку
    echo "<tr>\n";
    // перебираем все имена полей
    foreach($names as $k => $val)
    { // получаем значение поля
      $value = mysql_result($q, $i, $val);
      // выводим значение поля
      echo "<td ><font size=2>$value</font></td>\n";
    }
    echo "</tr>\n";
  }
  echo "</table>";
 

Фанат

oncle terrible
Команда форума
а просто от руки нарисовать шапку таблицы тебе не приходило в голову? в обычном HTML?
 

AndySharton

Новичок
Ладно шапку я сделаю - это второстепенный вопрос.
А как сделать нормальный вывод данных после запроса?
Особенно меня интересует когда в запросе извлекаются данные из нескольких таблиц.

Я знаю что вопрос может быть и очень древний, но я не смог найти нормальное его решение.
Если есть примеры будет очень здорово.
 
Сверху