|
|
|
| Столкнулся с такой проблемой. Буду использовать пример построения счетчика загрузки файлов с сервера из книги "Практика создания сайтов".
Имеем 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, а потом это учитывать. Это тоже нехорошо.
Как составить другой запрос не знаю! Помогите пожалуйста. Спасибо. | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: cheops
(01.06.2006 в 15:30)
| | Огромное спасибо всем за помощь. Обещаю добросовестно учить SQL, уже книжу заказал. А пока есть еще один вопрос. Нужно подсчитать количество закачек для каждого файла за все время и за последний месяц. Как это объединить в один запрос? У меня никак не получается. Спасибо. | |
|
|
|
|
|
|
|
для: 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. | |
|
|
|
|
|
|
|
для: cheops
(01.06.2006 в 22:09)
| | Это понятно. Я имел ввиду, как в одном запросе узнать количество загрузок за месяц и за все время одновременно? Т.е. количество загрузок должно подсчитываться с ограничением по дате и без него. | |
|
|
|
|
|
|
|
для: JuryFx
(01.06.2006 в 23:09)
| | сорри | |
|
|
|
|
|
|
|
для: JuryFx
(01.06.2006 в 23:09)
| | Лучше два запроса организуйте под каждое из чисел. | |
|
|
|