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
использование функций count() и max()
имеются 2 таблицы: authors (поля - аuthor_id(Primary key), name_) и books (поля - author_id(foreign key), book_name). необходимо найти автора, написавшего больше всего книг. Использую MS sql server 2005 management studio express. В принципе у меня есть 2 решения этой задачи но они меня не очень устраивают, так как в первом случае решение не очень красивое, а во втором громоздское
1)
Код:
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
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-й вариант решения помогла мне найти эта тема здесь на форуме , там же и приводился способ с подзапросами, но как не пытался не смог его реализовать для своей задачи. Заранее благодарен
может кто нибудь подскажет я вообще по адресу интересно обратился
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 (или как там нужно)...
спасибо, конечно, но решение с top у меня есть в перевом примере, мне просто необходимо именно конкретное решение, использующее подзапрос.
Собственно товарищ squirL и описал "именно конкретное решение, использующее подзапрос" на MySQL. Оно куда оптимальнее вашего первого солюшена так как не требует построения декартового пересечения или даже джоина.
Цитата: timurkino
спасибо, конечно, но решение с top у меня есть в перевом примере, мне просто необходимо именно конкретное решение, использующее подзапрос.
а я вам что дал? подправьте подзапрос под MS SQL и будет вам счастье.
я неясно выразился мне необходимо такое решение чтоб там не было таких "хитростей" типа использования top, а использоволась функция max(). ну да ладно уже а то я вижу мастеров sql уже притомила возня с этим примерчиком.
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;
Цитата: 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. Ведь ето частный случай когда оьвет один, а если таких авторов несколько....
Цитата: 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);
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);
Цитата: Rebbit
Может я того.... позно уже, но помойму такое не будет роботать вообще :)
ну вроде работает...
Цитата: 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);
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 не подходит)
Цитата: squirL
автору top не подходит)
Это я Реббиту пример привел, что TOP может использоваться и в случае, когда есть несколько авторов с одинаковым и наибольшим количеством книг. :)
аа... слушай, если MS SQL есть под рукой - проверь мой запрос ))) на мускуле работает, но он же ж на всю голову mysql... я про тот который второй
Цитата: squirL
аа... слушай, если MS SQL есть под рукой - проверь мой запрос ))) на мускуле работает, но он же ж на всю голову mysql... я про тот который второй
Что-то не фурычит (тестировал на одной из своих баз). С утра мозги в кучу, соображать лень. :o
да, что-то я извратился. один MySQL такое понимает )