Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сложный запрос из двух таблиц 
V
    Опции темы
Master_
  Дата 3.1.2008, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 31.1.2007

Репутация: нет
Всего: нет



Есть две таблицы.
В одной: d_id      d_date                f_id    user_id
                1      1199290023            1      1
                2      1199290080            2      1
                3      1199290087            2      1
В другой: f_id    f_name               f_download
                1        Первый файл    33
                2        Второй файл     32

Собственно первая таблица - логи скачивания файлов, ид, дата, ид файла, ид пользователя.

Во второй таблице ид файла, название и общее количество скачиваний.

Нужно сделать выборку на последние 10 скаченных файлов (не должны повторятся). Выводить названия и общее количество скачиваний..

Пробовал такой запрос:    
Код
SELECT DISTINCT download.user_id,download.f_id,file.f_name,file.f_downloads FROM ".SQL_PREFIX."ds_download AS download, ".SQL_PREFIX."ds_file AS file  WHERE download.user_id=".$member['id']

Но результат вообще не тот. Файлы повторяются одни и теже.


Помогите пожалуйста, как этот запрос сдеать?  smile 



Это сообщение отредактировал(а) Master_ - 3.1.2008, 00:53
PM   Вверх
yar
Дата 3.1.2008, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 8.9.2007
Где: Одесса, Украина

Репутация: нет
Всего: 8



Возможно, как-то так:

Код

SELECT * 
FROM ds_download JOIN (SELECT DISTINCT * FROM ds_file) AS file 
ON ds_download.f_id = file.f_id
WHERE file.user_id = 12345
SELECT file.f_name, file.f_downloads
LIMIT 10

--------------------
Если бы строители возводили здания так, как программисты пишут программы, первый же дятел уничтожил бы мировую цивилизацию.Джеральд Вайнберг
PM MAIL WWW   Вверх
vi_k
Дата 3.1.2008, 06:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 29.12.2007

Репутация: нет
Всего: нет



Уже на форуме как-то пробегало решение. Может где ошибся, но вроде бы так:

Код

SELECT f.f_name `file`, d.d_date `last_download_time`, cnt `count` FROM
(SELECT MAX(d_id) max_d_id, COUNT(*) cnt FROM d WHERE user_id=1 GROUP BY f_id ORDER BY max_d_id DESC LIMIT 10) dd
JOIN d ON dd.max_d_id=d.d_id
JOIN f ON d.f_id=f.f_id;


У меня MySQL 5.0.26. За работоспособность на других не ручаюсь.


Заодно: так ли необходимо поле f_download? в приведённом примере подсчёт производится по логу скачиваний.

PM MAIL   Вверх
Master_
Дата 3.1.2008, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 31.1.2007

Репутация: нет
Всего: нет



Цитата(vi_k @ 3.1.2008,  06:31)
Возможно, как-то так:
Код

SELECT * 
FROM ds_download JOIN (SELECT DISTINCT * FROM ds_file) AS file 
ON ds_download.f_id = file.f_id
WHERE file.user_id = 12345
SELECT file.f_name, file.f_downloads
LIMIT 10

При таком запросе у меня выводится ошибка на предпоследнюю строку с SELECT. #1064 - You have an error in your SQL syntax;

Добавлено @ 10:15
Попробовал такой запрос:
Код

 SELECT ds_file.f_name `file` , ds_download.d_date `last_download_time` , cnt `count`
FROM (

SELECT MAX( d_id ) max_d_id, COUNT( * ) cnt
FROM ds_download
WHERE user_id =1
GROUP BY f_id
ORDER BY max_d_id DESC
LIMIT 10
)ibf_ds_file
JOIN ds_download ON ds_file.max_d_id = ds_download.d_id
JOIN ds_file ON ds_download.f_id = ds_download.f_id
LIMIT 0 , 30 

Но опять выводится с повторениями :(

ЗЫ mySQL 5..

Это сообщение отредактировал(а) Master_ - 3.1.2008, 10:16
PM   Вверх
XEugene
Дата 3.1.2008, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 1.1.2008

Репутация: нет
Всего: 2



Код

SELECT DISTINCT file.f_name, file.f_download, download.d_id
FROM ds_download AS download
JOIN 
(SELECT DISTINCT * FROM ds_file) AS FILE
USING ( f_id )
WHERE download.user_id =1
ORDER BY download.d_id DESC
LIMIT 0 , 10
А так?
PM MAIL   Вверх
vi_k
Дата 3.1.2008, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 29.12.2007

Репутация: нет
Всего: нет



Странный у вас получился запрос. Откуда у вас в таблице ds_file взялся max_d_id? Тогда как он же должен был браться из ibf_ds_file!

Проверьте, перевёл имена таблиц в ваши. Замечу - это не теория, это практика. Я не от балды это пишу, а создал ваши таблицы и проверил на реальных данных. Всё работает, последний LIMIT не нужен, т.к. он есть во внутреннем запросе.

Код

SELECT ds_file.f_name `file`, ds_download.d_date `last_download_time`, cnt `count`
FROM (
SELECT MAX(d_id) max_d_id, COUNT(*) cnt
FROM ds_download
WHERE user_id=1
GROUP BY f_id
ORDER BY max_d_id DESC
LIMIT 10
) tmp
JOIN ds_download ON tmp.max_d_id=ds_download.d_id
JOIN ds_file ON ds_download.f_id=ds_file.f_id;


Попробуйте выполнить отдельно внутренний запрос, чтоб понять что происходит. В результате никак не может получиться больше 10 строк. И никак не может повториться файл с одинаковым f_id.


P.S. Если вам не понятно, что происходит и откуда что берётся в этом запросе вы лучше скажите - я объясню. Мне не лень smile
PM MAIL   Вверх
Master_
Дата 3.1.2008, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 31.1.2007

Репутация: нет
Всего: нет



vi_k, спсибо, так понятнее да и запрос заработал smile
PM   Вверх
XEugene
Дата 3.1.2008, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 1.1.2008

Репутация: нет
Всего: 2



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

SELECT DISTINCT file.f_name, file.f_download
FROM ds_download AS download
JOIN 
(SELECT DISTINCT * FROM ds_file) AS FILE
USING ( f_id )
WHERE download.user_id =1
ORDER BY download.d_id DESC
LIMIT 0 , 10

PM MAIL   Вверх
skyboy
Дата 3.1.2008, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260




M
skyboy
Если вопрос решен, помечайте тему соответствующим образом

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1164 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.