Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

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

 

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

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

тема: Счетчик загрузки файлов
 
 автор: JuryFx   (01.06.2006 в 13:22)   письмо автору
 
 

Столкнулся с такой проблемой. Буду использовать пример построения счетчика загрузки файлов с сервера из книги "Практика создания сайтов".
Имеем 2 таблицы: таблица файлов files и таблица, в которую заносится каждая загрузка файла hitfile.
Нужно вывести информацию о файлах и количестве их загрузок:

SELECT hitfile.id_file, files.description, count(hitfile.id_file) as num
FROM hitfile, files
WHERE hitfile.id_file = files.id_file
GROUP BY files.id_file

Все бы хорошо, но этот запрос не выводит файлы, которые не были еще закачены, т.е. не участвуют в таблице hitfile. А мне нужно, чтобы выводились все файлы. Как быть в этом случае?
Не перебирать же все файлы в цикле и для каждого делать запрос - это иррационально.
На ум приходит только то, что при добавлении файла в таблицу files, добавлять запись и в таблицу hitfile, а потом это учитывать. Это тоже нехорошо.
Как составить другой запрос не знаю! Помогите пожалуйста. Спасибо.

   
 
 автор: cheops   (01.06.2006 в 15:30)   письмо автору
 
   для: JuryFx   (01.06.2006 в 13:22)
 

В таких случаях используют левое объединение (LEFT JOIN)
SELECT hitfile.id_file, files.description, count(hitfile.id_file) as num 
FROM files LEFT JOIN hitfile 
WHERE hitfile.id_file = files.id_file 
GROUP BY files.id_file

   
 
 автор: Trianon   (01.06.2006 в 16:35)   письмо автору
 
   для: cheops   (01.06.2006 в 15:30)
 

левое внешнее соединение.

hitfiles.id_file будет недостижим для этих файлов. Нужно слегка изменить:

SELECT files.id_file as id_file, 
        files.description as description, 
        count(hitfile.id_file) as num 
FROM files LEFT JOIN hitfile 
WHERE hitfile.id_file = files.id_file 
GROUP BY files.id_file 

   
 
 автор: JuryFx   (01.06.2006 в 21:46)   письмо автору
 
   для: cheops   (01.06.2006 в 15:30)
 

Огромное спасибо всем за помощь. Обещаю добросовестно учить SQL, уже книжу заказал. А пока есть еще один вопрос. Нужно подсчитать количество закачек для каждого файла за все время и за последний месяц. Как это объединить в один запрос? У меня никак не получается. Спасибо.

   
 
 автор: cheops   (01.06.2006 в 22:09)   письмо автору
 
   для: JuryFx   (01.06.2006 в 21:46)
 

Просто следует добавить в условие WHERE ограничение на дату
SELECT files.id_file as id_file, 
        files.description as description, 
        count(hitfile.id_file) as num 
FROM files LEFT JOIN hitfile 
WHERE hitfile.id_file = files.id_file AND MONTH(hitfile.putdate) = ".date('n')."
GROUP BY files.id_file

Т.е. при помощи встроенной функции MONTH() - извлечь все записи, которые были сделаны за текущий месяц и сравнить их с номером месяца, получить который можно при помощи функции date('n') - сейчас июнь и она вернёт цифру 6.

   
 
 автор: JuryFx   (01.06.2006 в 23:09)   письмо автору
 
   для: cheops   (01.06.2006 в 22:09)
 

Это понятно. Я имел ввиду, как в одном запросе узнать количество загрузок за месяц и за все время одновременно? Т.е. количество загрузок должно подсчитываться с ограничением по дате и без него.

   
 
 автор: Trianon   (02.06.2006 в 10:15)   письмо автору
 
   для: JuryFx   (01.06.2006 в 23:09)
 

сорри

   
 
 автор: cheops   (02.06.2006 в 11:26)   письмо автору
 
   для: JuryFx   (01.06.2006 в 23:09)
 

Лучше два запроса организуйте под каждое из чисел.

   
Rambler's Top100
вверх

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