Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

использование функций count() и max()

55K
07 января 2010 года
timurkino
6 / / 07.01.2010
Здравствуйте, помогите с решением следующего вопроса -
имеются 2 таблицы: authors (поля - аuthor_id(Primary key), name_) и books (поля - author_id(foreign key), book_name). необходимо найти автора, написавшего больше всего книг. Использую MS sql server 2005 management studio express. В принципе у меня есть 2 решения этой задачи но они меня не очень устраивают, так как в первом случае решение не очень красивое, а во втором громоздское

1)

 
Код:
select top 1 authors.name_
    from books, authors
      where authors.author_ID = books.author_ID
        group by authors.name_
          order by count(books.author_id) desc


2)

 
Код:
select count(books.author_id) as kolichestvo, authors.name_ as imia
  into auth
    from books, authors
      where authors.author_ID = books.author_ID
        group by authors.name_
declare @x int
set @x = (select max(kolichestvo) from auth)
select imia from auth
  where kolichestvo = @x


Мне же необходимо чтобы задача была решена с помощью одного запроса (включающего подзапрос(ы)) и с помощью функций count и max, поскольку мне предстоит тестирования, в котором будут задачи такого плана и требующие такого решения. 1-й вариант решения помогла мне найти эта тема здесь на форуме , там же и приводился способ с подзапросами, но как не пытался не смог его реализовать для своей задачи. Заранее благодарен
55K
11 января 2010 года
timurkino
6 / / 07.01.2010
может кто нибудь подскажет я вообще по адресу интересно обратился
2
11 января 2010 года
squirL
5.6K / / 13.08.2003
я бы сделал так:
select authors.name from authors where author_id=(select author_id from books group by author_id order by count(author_id) desc limit 1);

только в MS SQL LIMIT нету, замените его там на top (или как там нужно)...
55K
11 января 2010 года
timurkino
6 / / 07.01.2010
спасибо, конечно, но решение с top у меня есть в перевом примере, мне просто необходимо именно конкретное решение, использующее подзапрос.
276
11 января 2010 года
Rebbit
1.1K / / 01.08.2005
Собственно товарищ squirL и описал "именно конкретное решение, использующее подзапрос" на MySQL. Оно куда оптимальнее вашего первого солюшена так как не требует построения декартового пересечения или даже джоина.
2
11 января 2010 года
squirL
5.6K / / 13.08.2003
Цитата: timurkino
спасибо, конечно, но решение с top у меня есть в перевом примере, мне просто необходимо именно конкретное решение, использующее подзапрос.



а я вам что дал? подправьте подзапрос под MS SQL и будет вам счастье.

55K
11 января 2010 года
timurkino
6 / / 07.01.2010
я неясно выразился мне необходимо такое решение чтоб там не было таких "хитростей" типа использования top, а использоволась функция max(). ну да ладно уже а то я вижу мастеров sql уже притомила возня с этим примерчиком.
2
11 января 2010 года
squirL
5.6K / / 13.08.2003
ну вот так...

select authors.name,max(a.b)
from
(select author_id,count(book_name) as b
from books group by author_id order by count(author_id) desc) as a
left join authors
on authors.author_id = a.author_id;
276
12 января 2010 года
Rebbit
1.1K / / 01.08.2005
Цитата: squirL

select authors.name,max(a.b)
from
(select author_id,count(book_name) as b
from books group by author_id order by count(author_id) desc) as a
left join authors
on authors.author_id = a.author_id;


Может я того.... позно уже, но помойму такое не будет роботать вообще :)
Да и даже если дописать group by то смысла в подобном запросе не оч много :)
А вообще squirL ми действительно были не правы с top/limit. Ведь ето частный случай когда оьвет один, а если таких авторов несколько....

5
12 января 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: Rebbit

А вообще squirL ми действительно были не правы с top/limit. Ведь ето частный случай когда оьвет один, а если таких авторов несколько....


 
Код:
SELECT authors.name
FROM authors
WHERE author_id IN (
    SELECT TOP 1 WITH TIES author_id
    FROM  books
    GROUP BY author_id
    ORDER BY COUNT(author_id) DESC);
2
12 января 2010 года
squirL
5.6K / / 13.08.2003
Цитата: Rebbit
Может я того.... позно уже, но помойму такое не будет роботать вообще :)


ну вроде работает...

2
12 января 2010 года
squirL
5.6K / / 13.08.2003
Цитата: hardcase
 
Код:
SELECT authors.name
FROM authors
WHERE author_id IN (
    SELECT TOP 1 WITH TIES author_id
    FROM  books
    GROUP BY author_id
    ORDER BY COUNT(author_id) DESC);


автору top не подходит)

5
12 января 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: squirL
автору top не подходит)


Это я Реббиту пример привел, что TOP может использоваться и в случае, когда есть несколько авторов с одинаковым и наибольшим количеством книг. :)

2
12 января 2010 года
squirL
5.6K / / 13.08.2003
аа... слушай, если MS SQL есть под рукой - проверь мой запрос ))) на мускуле работает, но он же ж на всю голову mysql... я про тот который второй
5
12 января 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: squirL
аа... слушай, если MS SQL есть под рукой - проверь мой запрос ))) на мускуле работает, но он же ж на всю голову mysql... я про тот который второй


Что-то не фурычит (тестировал на одной из своих баз). С утра мозги в кучу, соображать лень. :o

2
12 января 2010 года
squirL
5.6K / / 13.08.2003
да, что-то я извратился. один MySQL такое понимает )
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог