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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Access] Не могу правильно отсортировать 
V
    Опции темы
bullvinkle
Дата 6.10.2009, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



У меня есть база. Типа база веб-сайта. Вот ее схема:
user posted image
А мне надо сделать запрос на составление таблицы "Рейтинг источников информации за последний месяц (исходя из количества просмотров новости этого источника)".
Я так понял, требуется следующее
1. Из таблицы ЧтениеНовостей выбрать коды всех новостей за последний месяц и отсортировать их по количеству просмотров. Здесь каждая запись в таблице и есть один просмотр.
2. Из таблицы Новости выбрать коды всех источников информации, у которых код_новости IN результаты_первого_пункта, и отсортировать эти результаты по количеству просмотров - вот этого я не представляю как сделать.
3. Из таблицы ИсточникиИнформации выбрать все поля, где код_источника IN результаты_предыдущего_пункта, и снова сортировать по количеству просмотров. До этого пункта еще не дошел.
4. И собственно создать таблицу.
Код

SELECT DISTINCT код_источника
FROM Новости
WHERE код_новости  IN (
SELECT код_новости
FROM ЧтениеНовостей
WHERE DATEPART('m',дата_времени_чтения)=[Введите_номер_месяца]
);

Это то, что получается на пункте 2, но без сортировки. 
PM MAIL ICQ   Вверх
Gluttton
Дата 6.10.2009, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

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



bullvinkle, открой для себя ORDER BY smile ...


--------------------
Слава Україні!
PM MAIL   Вверх
bullvinkle
Дата 6.10.2009, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я знаю про ODER BY
Но если писать вот так
Код

SELECT DISTINCT код_источника
FROM Новости
WHERE код_новости  IN (
SELECT код_новости
FROM ЧтениеНовостей
WHERE DATEPART('m',дата_времени_чтения)=[Введите_номер_месяца]
)
GROUP BY (ЧтениеНовостей.код_новости)
ORDER BY COUNT(ЧтениеНовостей.дата_времени_чтения);

то будет ошибка.
Мне вот интересно ODER BY <что>. Мне надо выбранные код_источника из таблицы Новости упорядочить по количеству ....я даже не знаю как это выразить....записей в таблице ЧтениеНовостей которые сгруппированы по соответствующему коду_новости.
Вобщем все запутано и извращенно. Я не понимаю как это возможно.
PM MAIL ICQ   Вверх
Gluttton
Дата 6.10.2009, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

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



Код

SELECT DISTINCT
    код_источника
FROM
(
    SELECT  
        код_источника, 
        COUNT(ЧтениеНовостей.дата_времени_чтения) AS кл
    FROM Новости
        WHERE код_новости  IN 
        (
            SELECT код_новости
            FROM ЧтениеНовостей
                WHERE DATEPART('m',дата_времени_чтения)=[Введите_номер_месяца]
        )
        GROUP BY (код_источника)
)   AS S
    ORDER BY кл

Ну что то вроде такого... Но не проверял, скорее всего будет с ошибками...
Маленькая рецензия:
Цитата(bullvinkle @  6.10.2009,  20:29 Найти цитируемый пост)
GROUP BY (ЧтениеНовостей.код_новости)

Так делать нельзя т.к. поле ЧтениеНовостей.код_новости не указано в предложении SELECT...

Если хотите более конкретной помощи, то выкладывайте сюда БД.



--------------------
Слава Україні!
PM MAIL   Вверх
Gluttton
Дата 6.10.2009, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

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



А вообще как бы...
Цитата(bullvinkle @  6.10.2009,  19:07 Найти цитируемый пост)
Рейтинг источников информации за последний месяц исходя из количества просмотров новости этого источника

1. Каркас (список источников информации):
Код

SELECT
    код
FROM
    ИсточникиНовостей


2. Что бы можно было "исходить из количества просмотров" выполняем связывание таблицы ИсточникиНовостей и ЧтениеНовостей через все промежуточные таблицы (в данном случае это Новости) по ключам:
Код

SELECT
    ИсточникиНовостей.код,
    ЧтениеНовостей.код_записи
FROM
    ИсточникиНовостей, Новости, ЧтениеНовостей
    WHERE ИсточникиНовостей.код=Новости.код_источника
    AND Новости.код_новости=ЧтениеНовостей.код_новости


3. Обеспечиваем "за последний месяц"
Код

SELECT
    ИсточникиНовостей.код,
    ЧтениеНовостей.код_записи    
FROM
    ИсточникиНовостей, Новости, ЧтениеНовостей
    WHERE ИсточникиНовостей.код=Новости.код_источника
    AND Новости.код_новости=ЧтениеНовостей.код_новости
    AND ЧтениеНовостей.дата_времени_чтения>#09/06/2009#


4. Обеспечиваем подсчет количества разов прочтения новостей:
Код

SELECT
    ИсточникиНовостей.код,
    COUNT(ЧтениеНовостей.код_записи) AS количество
FROM
    ИсточникиНовостей, Новости, ЧтениеНовостей
    WHERE ИсточникиНовостей.код=Новости.код_источника
    AND Новости.код_новости=ЧтениеНовостей.код_новости
    AND ЧтениеНовостей.дата_времени_чтения>#09/06/2009#
    GROUP BY ИсточникиНовостей.код


5. Финальная версия - обеспечиваем сортировку:
Код

SELECT
    Подзапрос.код
FROM
(
    SELECT
        ИсточникиНовостей.код,
        COUNT(ЧтениеНовостей.код_записи) AS количество
    FROM
        ИсточникиНовостей, Новости, ЧтениеНовостей
        WHERE ИсточникиНовостей.код=Новости.код_источника
        AND Новости.код_новости=ЧтениеНовостей.код_новости
        AND ЧтениеНовостей.дата_времени_чтения>#09/06/2009#
        GROUP BY ИсточникиНовостей.код
)   AS Подзапрос
    ORDER BY Подзапрос.количество


Добавлено @ 21:22
Но опять-таки не проверял, а значит будут ошибки smile ... - проверил, ошибки исправил...
А так же сравнение с датой написал на абум - нужно уточнить формат дат в Access... - уточнил формат даты...
Соединение выполняю не по INNER JOIN, а по WHERE, что бы не париться со скобками, которые так любит Access smile ...

Это сообщение отредактировал(а) Gluttton - 7.10.2009, 13:35


--------------------
Слава Україні!
PM MAIL   Вверх
bullvinkle
Дата 6.10.2009, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Да там ошибка, что ODER BY конфликтует с DISTINGT, а если DISTINGT удалить, то ошибка про недопустимое имя.
Базу добавил в аттаче. Я ее заполнял сам и там очень мало записей и они бессмысленны, но читабельны. Поэтому WHERE DATEPART('m',дата_времени_чтения)=[Введите_номер_месяца], номер месяца может быть только 10, что бы результат был. Можно сразу в запросе исправить. А правильный уже упорядоченный список кодов_источника должен выглядеть так: 1002, 1004 (это типа у источников сэтими кодами самые часто читаемые новости ), а дальше в любом порядке 1001 и 1003.



Отправил сообщение до того как увидел предыдущее, этот текст к сообщению № 4

Это сообщение отредактировал(а) bullvinkle - 6.10.2009, 21:39

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  2.7z 17,39 Kb
PM MAIL ICQ   Вверх
Gluttton
Дата 6.10.2009, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

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



Вот рабочий код:
Код

SELECT
    Подзапрос.код
FROM
(
    SELECT
        ИсточникиНовостей.код,
        COUNT(ЧтениеНовостей.код_записи) AS количество
    FROM
        ИсточникиНовостей, Новости, ЧтениеНовостей
        WHERE ИсточникиНовостей.код=Новости.код_источника
        AND Новости.код_новости=ЧтениеНовостей.код_новости
        AND ЧтениеНовостей.дата_времени_чтения>#09/06/2009#
        GROUP BY ИсточникиНовостей.код
)   AS Подзапрос
    ORDER BY Подзапрос.количество

Но данные не такие:

Цитата(bullvinkle @  6.10.2009,  21:37 Найти цитируемый пост)
1002, 1004 (это типа у источников сэтими кодами самые часто читаемые новости ), а дальше в любом порядке 1001 и 1003.


Думаю...


--------------------
Слава Україні!
PM MAIL   Вверх
bullvinkle
Дата 6.10.2009, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот этот код работает (его подправил, что бы можно было месяц выбрать)
Код

SELECT Подзапрос.имя
FROM [SELECT
        ИсточникиНовостей.имя,
        COUNT(ЧтениеНовостей.код_записи) AS количество
    FROM
        ИсточникиНовостей, Новости, ЧтениеНовостей
        WHERE
         ИсточникиНовостей.код=Новости.код_источника
        AND Новости.код_новости=ЧтениеНовостей.код_новости
        AND DATEPART('m',ЧтениеНовостей.дата_времени_чтения)=[Введите_номер_месяца]
        GROUP BY ИсточникиНовостей.имя
]. AS Подзапрос
ORDER BY Подзапрос.количество;


Спасибо за помощь. Особенно за объяснение с картинками и поэтапно smile

Данные как надо, то я ошибся в том сообщении..


Это сообщение отредактировал(а) bullvinkle - 6.10.2009, 21:55
PM MAIL ICQ   Вверх
Gluttton
Дата 6.10.2009, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

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



Окончательный вариант:
Код

SELECT
    Подзапрос.код
FROM
(
    SELECT
        ИсточникиНовостей.код,
        COUNT(ЧтениеНовостей.код_записи) AS количество
    FROM
        ИсточникиНовостей, Новости, ЧтениеНовостей
        WHERE ИсточникиНовостей.код=Новости.код_источника
        AND Новости.код_новости=ЧтениеНовостей.код_новости
        AND ЧтениеНовостей.дата_времени_чтения>#09/06/2009#
        GROUP BY ИсточникиНовостей.код
)   AS Подзапрос
    ORDER BY Подзапрос.количество DESC

Для проверки под второй строки можно ввести после запятой: Подзапрос.количество...
P.S. С датами решил не играться... Если по хорошему, то "за последний месяц" это значит, что нужно брать текущую дату (как это в Access не знаю) от неё отнимать месяц и с полученым значением проводить сравнение...
Цитата

Спасибо за помощь. Особенно за объяснение с картинками и поэтапно 

Всегда пожалуйста smile, лишь бы на пользу smile ...


Это сообщение отредактировал(а) Gluttton - 6.10.2009, 22:01


--------------------
Слава Україні!
PM MAIL   Вверх
bullvinkle
Дата 6.10.2009, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Во! Вот это точно то, что надо. Еще раз спасибо!

"За последний месяц" с помощью функции DATE() можно сделать. Но мне сейчас это не важно, база все-равно учебная, и заполнять ее правильно нет смысла, а времени уйдет много.

Это сообщение отредактировал(а) bullvinkle - 6.10.2009, 22:11
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




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


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

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