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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> запрос-репорт, торможу, подсобите пожалуйста 
:(
    Опции темы
bilbobagginz
Дата 28.7.2008, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

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



подучиваюсь, решаю задачки. есть таблица:
статьи(идентификатор,автор,данныеостатье)
идентификатор - уникальный. надо составить запрос, который выведет автора, у которого больше всего статей.
это не подвязано к какой-то БД, "чистый" SQL.
можно юзать: select,view,count(),max(),union,intersect,except и т.д.
можно делать несколько views.
создал view:
Код

create view авторы as
select distrinct автор
from статьи;

теперь надо "как-то" продвигаться дальше,
но я не вдупляю как "дальше быть".
ткните носом куда копнуть!
я пока читаю что к чему, может у кого идея будет.




--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
bilbobagginz
Дата 28.7.2008, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

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



понял, что надо:
Код

create view поавторам as
select автор,cnt(идентификатор) as колво
from статьи 
group by автор;

a потом:
Код

select автор from поавторам
where колво=(select max(колво) from поавторам);


получается.


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
while
Дата 29.7.2008, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если одним запросом:

select идентификатор, автор, данныеостатье
from TABLE
where идентификатор in (select max(COUNT_FIELD) from (select count(автор) as COUNT_FIELD from TABLE group by автор))


С использованием процедур:

зависит от СУБД smile

Это сообщение отредактировал(а) while - 29.7.2008, 00:32
PM MAIL   Вверх
bilbobagginz
Дата 29.7.2008, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

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



while, извините за вопрос: я ошибаюсь, или вы предположили что имя таблицы - "TABLE".
я новичок в SQL, но ужасно дотошный индивид!




--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
while
Дата 29.7.2008, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Конечно, предположил. TABLE - некоторая таблица... smile
PM MAIL   Вверх
bilbobagginz
Дата 29.7.2008, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

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



т.е.вашим путём я получаю:
Код

SELECT автор 
FROM статьи
WHERE идентификатор IN (
    SELECT max(колво) 
    FROM (
        SELECT count(идентификатор) AS колво 
        FROM статьи GROUP BY автор))

но с т.з. временной сложности (т.е. эффективности) оба решения идентичны... 
или нет ?



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
while
Дата 29.7.2008, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

SELECT автор 
FROM статьи
WHERE идентификатор IN (
    SELECT max(колво) 
    FROM (
        SELECT count(идентификатор) AS колво 
        FROM статьи GROUP BY автор))


Да.

Цитата

но с т.з. временной сложности


А вот это уже отчасти зависит от СУБД, кол-ва записей, наличия индексов и т.д. smile. К тому же view еще нужно создать. И если он нужен для одного запроса, то .... ? 

С применением хранимых процедур, курсоров  - выйдет быстрее, но их реализация сильно зависит от СУБД.

Это сообщение отредактировал(а) while - 29.7.2008, 01:08
PM MAIL   Вверх
Akina
Дата 29.7.2008, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

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



Цитата(while @  29.7.2008,  01:30 Найти цитируемый пост)
Если одним запросом:

Товарищ просил 
Цитата(bilbobagginz @  29.7.2008,  00:08 Найти цитируемый пост)
это не подвязано к какой-то БД, "чистый" SQL.

а как там с подзапросами?
К тому же не требуется инфа по самим статьям - потому вьюв по авторам, который написАл bilbobagginz, одновременно является и требуемым запросом.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
bilbobagginz
Дата 30.7.2008, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

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



Цитата(Akina @  29.7.2008,  07:50 Найти цитируемый пост)
а как там с подзапросами?

насколько я понял задание - в "нашем" SQL есть подзапросы.




--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
Akina
Дата 30.7.2008, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

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



Ну так 
Код
select автор, cnt(идентификатор) as колво
from статьи 
group by автор
order by колво DESC
выведет всех авторов в порядке уменьшения количества статей. Если нужен один, который самый плодовитый, следует дополнительно использовать ограничение по количеству. А как оно будет выглядеть - TOP 1 или там LIMIT 1 - зависит от диалекта.

Если же использовать вьюху
Код
create view поавторам as
select автор, cnt(идентификатор) as колво
from статьи 
group by автор
то запрос будет выглядеть как
Код
select *
from поавторам 
order by колво DESC
И опять же, если надо, то в запросе делаем ограничение по количеству. Или ограничение и сортировку переносим во вьюху
Код
create view поавторам_1 as
select TOP 1 автор, cnt(идентификатор) as колво
from статьи 
group by автор
order by колво DESC
и запрос вообще упрощается донельзя
Код
select *
from поавторам_1


Это сообщение отредактировал(а) Akina - 30.7.2008, 18:04


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
bilbobagginz
Дата 31.7.2008, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

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



Akina, хмм.. упрощаться-то он упрощается, только вот вопрос: в чем тут выгода.
не может же быть, что всё прям так в шоколаде ?
чем я заплатил (кроме мысли) создав 2 вью ?



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
skyboy
Дата 31.7.2008, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(bilbobagginz @  31.7.2008,  19:27 Найти цитируемый пост)
чем я заплатил (кроме мысли) создав 2 вью ?

зависит от оптимизатора.
в случае сложных многоуровневых запросов я бы убедился, что "вьюшность" запроса не мешает оптимизатору выбирать подходящие индексы.
кроме того, некоторые(скорее всего - все) СУБД(MSSQL - точно, проверено опытом) накладывают ограничения на количество вьюшек в одном запросе(а если у тебя вьюшки на вьюшках созданы, то вполне безобидный с первого взгляда запрос может не выполняться...)
PM MAIL   Вверх
ТоляМБА
Дата 1.8.2008, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


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

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



Это всё конечно хорошо, но давайте спустимся не грешную землю и возьмем ситуацию из реальной жизни. Несколько авторов написали несколько статей от 2 до 5 к примеру, но Петров написал 10 статей и Петров не отстал в количестве, то есть тоже 10 написал.
Рассматривая запросы:

Цитата(while @  29.7.2008,  03:30 Найти цитируемый пост)
select идентификатор, автор, данныеостатье 
from TABLE 
where идентификатор in 
(select max(COUNT_FIELD) 
from (select count(автор) as COUNT_FIELD 
from TABLE group by автор))
Получим обоих авторов, как и надо. Мы же других критериев отбора не вводим.
А кого мы получим используя
Цитата(Akina @  30.7.2008,  20:58 Найти цитируемый пост)
create view поавторам_1 as 
select TOP 1 автор, cnt(идентификатор) as колво 
from статьи 
group by автор 
order by колво DESC
можно угадать с вероятностью 50/50, но только Иванова или только Петрова.

Для MS-SQL в данном случае используется:
Код
create view поавторам_1 as 
select TOP 1 WITH TIES автор, cnt(идентификатор) as колво 
from статьи 
group by автор 
order by колво DESC

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


 




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


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

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