Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Подсчитать количество листов, распечатанных каждым принтером - двухтабличный запрос
 
 автор: lenbb   (08.06.2007 в 11:05)   письмо автору
 
 

Привет всем
Не знаю как назвать тему поэтому так
Дело в следующем: есть две таблицы в одной содержиться количество распечатанных листов и дата, время когда был произведен подсчет (восточный формат) и forign key от второй Во второй данные по принтерам (названия) В первой forign key от принтеров конечно повторяются (разное время подсчета)
Нужно для каждого одного принтера подсчитать сколько он распечатал не только за весь период но и за сколько времени (в общем). И вывести в таблице как от и до (даты), общее время и количество распечатанных листов в общем.
Горю не могу и не знаю как. В php-mysql-sql не так давно и знаний не так много
Подскажите хобя бы в каком направлении искать или бросьте ссылки
Заранее спасибо
В общем выглядит так:

table 1

3 ...... 345....... 2007-06-01
2 ...... 3678 .... 2007-06-03
3 ....... 438........ 2007-06-05
2.........4875 ......2007-06-07

table 2

3 ..... printer 1
2 ----printer 2

То есть вычесть 438 и 345 и сказать что за период с 2007-06-01 по 2007-06-05 и что за 5 дней было распечатано 97 листов
и так же для второго

   
 
 автор: Gust   (08.06.2007 в 12:14)   письмо автору
 
   для: lenbb   (08.06.2007 в 11:05)
 

может чтото вроде этого:

SELECT table2.имяПринтера, count(table1.Страниц), min(table1.Дата), max(table1.Дата)
FROM table1 LEFT JOIN table2 ON table1.IDПринтера=table2.IDПринтера
GROUP BY table1.IDПринтера

Если надо будет узнавать тоже самое, но в определенный срок, скажем с 2007-06-01 по 2007-06-04, нужно будет добавить условие отбора по дате типа:

WHERE table1.Дата>ДатаНачала and table1.Дата<ДатаКонца

   
 
 автор: lenbb   (08.06.2007 в 12:24)   письмо автору
 
   для: Gust   (08.06.2007 в 12:14)
 

Буду пробовать Спасибо!

   
 
 автор: Trianon   (08.06.2007 в 14:15)   письмо автору
 
   для: Gust   (08.06.2007 в 12:14)
 

ваш запррос вытащит для каждого принтера
его имя,
число снятых отчетов,
дату первого отчета,
дату последнего отчета.

при наличии WHERE - то же самое, но на интервале времени.

   
 
 автор: Trianon   (08.06.2007 в 12:22)   письмо автору
 
   для: lenbb   (08.06.2007 в 11:05)
 

есть ли у таблицы первичный auto_increment - ключ?
Весьма желательно привести полную структуру.

   
 
 автор: lenbb   (08.06.2007 в 12:47)   письмо автору
 
   для: Trianon   (08.06.2007 в 12:22)
 

Про разрывы не совсем понял Если про дату то нет нету Просто из последней даты вычесть первую и сказать что за такой то период распечатано столько то
Да первичный есть у обоих - авто Но первичный от table2 используется в table1 как вторичный
Полную не совсем могу На самом деле структура такая как описал Она конечно больше но остальное относится к другому

   
 
 автор: Trianon   (08.06.2007 в 13:19)   письмо автору
 
   для: lenbb   (08.06.2007 в 12:47)
 

Всё было бы куда проще, если бы была еще одна колонка с непрерывной нумерацией отчетов, независимо по каждому принтеру....

   
 
 автор: lenbb   (08.06.2007 в 13:28)   письмо автору
 
   для: Trianon   (08.06.2007 в 13:19)
 

Возможно, я не знаю Базу делал не я И переделывать навряд-ли кто-то будет да и время на это уже нет Есть то что есть

   
 
 автор: Trianon   (08.06.2007 в 13:35)   письмо автору
 
   для: Trianon   (08.06.2007 в 13:19)
 

А так будет довольно громоздко.

SELECT 
    printers.printername,
    rep.printer_id, 
    prv.dt AS dt_from, 
    rep.dt AS dt_to, 
    to_days( rep.dt ) - to_days( prv.dt ) AS days, 
    rep.pages - prv.pages AS pages
  FROM reports AS rep
  JOIN (
    SELECT next.printer_id, next.dt, max( prev.dt ) AS pdt
      FROM reports AS next
      JOIN reports AS prev ON next.printer_id = prev.printer_id AND next.dt > prev.dt
    GROUP BY next.printer_id, next.dt
    ) AS np ON rep.printer_id = np.printer_id AND rep.dt = np.dt
  JOIN reports AS prv ON np.printer_id = prv.printer_id AND np.pdt = prv.dt
  LEFT JOIN printers ON rep.printer_id = printers.id_printer

   
 
 автор: Trianon   (08.06.2007 в 13:40)   письмо автору
 
   для: Trianon   (08.06.2007 в 13:35)
 


printername printer_id dt_from       dt_to days  pages  
HP LJ 4200        3 2007-06-01  2007-06-05    4   93 
Ricoh Aficio 1015 2 2007-06-03  2007-06-07    4 1197 

   
 
 автор: lenbb   (08.06.2007 в 14:09)   письмо автору
 
   для: Trianon   (08.06.2007 в 13:40)
 

Круто Нет Слов Спасибо!!

   
 
 автор: lenbb   (08.06.2007 в 14:24)   письмо автору
 
   для: Trianon   (08.06.2007 в 13:40)
 

А-а Круто-то круто Только мне самому здесь не разобраться Если у тебя выпадет свободная минутка (вдруг такое случится) мог бы мне пожалуйста объяснить что да как Как работает А самому мне это не по силам понять

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования