Как сделать этот поиск в SQL - PullRequest
0 голосов
/ 03 мая 2020

Моя задача - создать заявление для ответа на этот вопрос:

Перечислите каждого автора (по фамилии и имени) и количество книг, написанных автором.

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

таблица книг с isbn (основной), заголовок, тип, pub_id, цена, продвижение, ytd_sales, pub_date

таблица bookauthor (которая находится в между книгой и автором) с, author_id (основной), isbn, author_order, royaltyshare

таблица автора с, author_id (основной), ssn, фамилия, имя, телефон, адрес, город, штат, zip

select author.lastname, author.firstname, bookauthor.count(author_id)
from author a
join bookauthor ba on ba.author_id = a.author_id
group by lastname

Это то, что я получил, но это не работает, и по какой-то причине мне трудно разобраться с этими типами SQL операторов с помощью join и in, а также с этими типами операторов. Если бы кто-нибудь мог помочь объяснить процесс более, это было бы очень ценно.

Ответы [ 5 ]

3 голосов
/ 03 мая 2020

У вас есть несколько вопросов. С самого начала запроса:

  1. Когда вы определяете псевдоним таблицы (a - псевдоним для author), вы должны использовать этот псевдоним везде, к которым вы конкретно обращаетесь таблица author, поэтому в вашей SELECT вы должны сказать SELECT a.lastname, a.firstname;
  2. Когда вы хотите что-то COUNT, имя таблицы идет внутри COUNT, и снова вы должны использовать Псевдоним таблицы, который вы определили: COUNT(ba.author_id)
  3. Вы можете использовать псевдоним столбца для своего счета, чтобы было легче ссылаться, например, COUNT(ba.author_id) AS num_books
  4. Вы должны использовать LEFT JOIN, чтобы вы может перечислить авторов, которые не написали книг (если они есть)
  5. Чтобы быть строго совместимыми, вы должны GROUP BY все неагрегированные столбцы, поэтому это должно быть GROUP BY a.lastname, a.firstname.
  6. Как было отмечено @Strawberry, вам действительно нужно сгруппировать author_id, поскольку возможно, что два автора имеют одно и то же имя. Поскольку author_id является первичным ключом, в MySQL разрешено группировать только по этому полю, однако сервер SQL требует, чтобы вы по-прежнему группировали также по lastname и firstname.

Всего ваш запрос должен быть:

SELECT a.lastname, a.firstname, COUNT(ba.author_id) AS num_books
FROM author a
LEFT JOIN bookauthor ba ON ba.author_id = a.author_id
GROUP BY a.author_id, a.lastname, a.firstname
1 голос
/ 03 мая 2020

После того, как вы создали псевдоним таблицы, вам нужно использовать псевдоним, когда вы позже обратитесь к этой таблице:

select 
    a.lastname, 
    a.firstname, 
    TotalBooksForAuthor = count(a.author_id)
from 
    author a
    join bookauthor ba on ba.author_id = a.author_id
group by
    a.author_id,
    a.lastname,
    a.firstname
0 голосов
/ 03 мая 2020

Вы должны включить все столбцы в select в вашем group by, и, во-вторых, как только вы определили псевдоним таблицы, везде используйте это псевдоним:

select  a.firstname, a.lastname, count(ba.author_id)
from author a
join bookauthor ba on ba.author_id = a.author_id
group by a.firstname, a.lastname
0 голосов
/ 03 мая 2020

Попробуйте этот SQL синтаксис:

SELECT a.lastname + ', '+ a.firstname, COUNT(b.author_id)
FROM author AS a
LEFT JOIN bookauthor AS b ON a.author_id = b.author_id
GROUP BY a.lastname, a.firstname
0 голосов
/ 03 мая 2020

Вам не хватает firstname в group by. Также способ, которым вы использовали count, неправильный. Попробуйте следующее.

select 
    lastname, 
    firstname, 
    count(author_id) as total_books
from author a
join bookauthor ba 
on ba.author_id = a.author_id
group by 
    lastname,
    firstname
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...