Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Не уверен в правильности запроса (Дима) 18/06/2018 - 11:53:45
      Re: Не уверен в правильности запроса (Akina) 18/06/2018 - 14:20:05

> Original message text:
> From: Дима - 18/06/2018 - 11:53:45
> Subject:Не уверен в правильности запроса
> -----------------
> Вроде простая задача, но mysql знаю плохо поэтому прошу проверить.
> БД это таблица авторов, ими написаных книг и отношение соответственно один к многим.
> Задача - вытащить список книг, которые написаны 3-мя со-авторами. То есть получить отчет «книга — количество соавторов» и отфильтровать те, у которых со-авторов меньше 3х.
>
> мой вариант такой, насколько правильно и можно ли улучшить ?
>
> CREATE TABLE author (
> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
> NAME VARCHAR(255) NOT NULL);
>
> CREATE TABLE book (
> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
> NAME VARCHAR(255) NOT NULL);
>
> CREATE TABLE author_book (
> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
> author_id INT NOT NULL,
> book_id INT NOT NULL);
>
> SELECT * FROM book b INNER JOIN author_book ab ON b.id = ab.`book_id`
> INNER JOIN author a ON a.id = ab.`author_id`
> GROUP BY b.`name`
> HAVING COUNT(*) = 3;
>
>


From: Akina - 18/06/2018 - 14:20:05
Subject:Не уверен в правильности запроса
-----------------
Запрос правилен - в том смысле, что правильно выберет книги. И ошибочен - в том смысле, что для каждой книги выведет одного из авторов, причём отфонарно. Для исправления необходимо заменить звезду в списке вывода на список отдельных полей (в крайнем случае - ограничить вывод только полями таблицы книг, т.е. не '*', а 'b.*'.

И ещё ошибка (потенциально) - структура не запрещает дублирования. Т.е. формально запиши три раза одного автора - и книга попадёт в вывод. Для исправления необходимо в пост-отборе считать не записи вообще, а уникальных авторов. Т.е. не COUNT(*), а COUNT(DISTINCT author_book.author_id).

ПС. Внешне кажется, что таблица авторов в запросе лишняя - это не так. Вдруг книге будет приписан ИД несуществующего автора...


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
45338



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |