SQL问题(多图片请谅解)

问题为显示写过 3 本书以上的作者的名字和姓氏。除了每个名字之外,还显示书籍的数量。
由三个表连在一起,book --- written_by --- author

img

img

img

然后这个是我目前写的以及出来的东西
SELECT a.FIRSTNAME,a.LASTNAME,b.title as name_of_book, count(b.title) as number_of_book
FROM book as b
left join written_by as w
on b.BOOKDESCID = w.BOOKDESCID
left join author as a
on w.AUTHORID = a.AUTHORID
Group by a.FIRSTNAME
HAVING number_of_book > 3

但是显示不对,求各位指点!

试试


SELECT a.FIRSTNAME, a.LASTNAME, COUNT(b.BOOKDESCID) as number_of_book
FROM author as a

INNER JOIN written_by as w
ON a.AUTHORID = w.AUTHORID

INNER JOIN book as b
ON w.BOOKDESCID = b.BOOKDESCID

GROUP BY a.AUTHORID, a.FIRSTNAME, a.LASTNAME

HAVING COUNT(b.BOOKDESCID) > 3;


你看看这个是不是你要的结果,如有帮助,麻烦点个采纳

SELECT a.firstname, a.lastname, COUNT(*) AS book_count
FROM author a
JOIN written_by wb ON a.authorid = wb.authorid
GROUP BY a.authorid, a.firstname, a.lastname
HAVING COUNT(*) >= 3;

这个sql是使用了JOIN来连接author表和written_by
使用GROUP BY对作者的authoridfirstnamelastname进行分组。
使用HAVING COUNT(*) >= 3来筛选出写过3本以上书籍的作者。
使用COUNT(*)获取每个作者写过的书籍数量。结果将显示作者的名字、姓氏和书籍数量。

问题点:数据查询结果不对,count(b.title) as number_of_book 无法得出写过 3 本书以上的作者
分析思路:
①写过 3 本书以上的作者(从written_by表,统计出现三次以上的authorid 或 从book表统计,但没看到authorid)
②在①的基础上,从author表查询对应authorid的名字和姓氏
③在①的基础上,从book表查询对应BOOKDESCID的信息(第三步有必要?如果只要书籍数量).

1、group by 改用 authorid,用firstname可能会有重名的;
2、如果3本以上包括3本的话having 后面用>=3 或>2;
3、仔细检查如果书有多个作者的话,你在手工统计的数量是否正确。

你可以试试这个,可以使用以下SQL查询来实现你的要求:

SELECT author.first_name, author.last_name, COUNT(book.id) AS book_count
FROM book
JOIN written_by ON book.id = written_by.book_id
JOIN author ON written_by.author_id = author.id
GROUP BY author.first_name, author.last_name
HAVING COUNT(book.id) >= 3;

这个查询将从三个表(book,written_by,author)中获取数据。首先,使用JOIN语句将这三个表连接在一起,通过它们之间的关联字段进行匹配。然后,使用GROUP BY子句将结果按作者的名字和姓氏分组。接下来,使用COUNT函数计算每个作者的书籍数量,并将其命名为"book_count"。最后,使用HAVING子句过滤出至少有3本书的作者。查询的结果将包含作者的名字、姓氏和书籍数量。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答由chatgpt基于相关博客总结生成:
    SELECT a.FIRSTNAME, a.LASTNAME, count(b.title) AS number_of_book
    FROM book AS b
    JOIN written_by AS w ON b.BOOKDESCID = w.BOOKDESCID
    JOIN author AS a ON w.AUTHORID = a.AUTHORID
    GROUP BY a.FIRSTNAME, a.LASTNAME
    HAVING number_of_book > 3
    

    解释: 1. 首先,我们需要使用JOIN而不是LEFT JOIN来连接三个表。因为我们只关心那些确实有书籍的作者,而不是那些没有写书的作者。 2. 其次,我们需要在GROUP BY子句中包含所有需要显示的字段,即FIRSTNAMELASTNAME,以便正确地分组作者。 3. 最后,我们只需要计算每个分组中书籍的数量,所以在SELECT子句中只需包含count(b.title)而不需要包含b.title。同时,我们将其更名为number_of_book以帮助清晰地理解查询结果。

    这样,我们就可以得到每个写过三本以上书籍的作者的名字、姓氏和所写书籍的数量。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

思路:首先分组获取写书超过三本的作者id 和图书数量,然后关联作者表进行查询

select a.FIRSTNAME,a.LASTNAME,t.bookCount from (
select AUTHORID,count(AUTHORID) bookCount from  written_by 
GROUP by AUTHORID HAVING count(AUTHORID)>3)
t left join author as a
on t.AUTHORID = a.AUTHORID

三表关联查询,查出这个作者写的所有书籍,然后按照作者分组,通过having子句过滤出,每一组中书籍数量大于3本的数据,代码如下所示:

select
    T1.AUTHORID,T1.FIRSTNAME,T1.LASTNAME,count(1) as num
from author T1
inner join written_by T2
on T1.AUTHORID = T2.AUTHORID

inner join book T3
on T2.BOOKDESCID = T3.BOOKDESCID

group by T1.AUTHORID,T1.FIRSTNAME,T1.LASTNAME

having count(1) > 3;

代码如下所示:

select
    T1.AUTHORID,T1.FIRSTNAME,T1.LASTNAME,count(1) as num
from author T1
inner join written_by T2
on T1.AUTHORID = T2.AUTHORID

inner join book T3
on T2.BOOKDESCID = T3.BOOKDESCID

group by T1.AUTHORID,T1.FIRSTNAME,T1.LASTNAME

having count(1) > 3;

你只根据firstName 分组有点问题的吧;试试我的能不能行:

SELECT
    a.FIRSTNAME,
    a.LASTNAME,
    w.AUTHORID,
    b.title AS name_of_book,
    count( b.title ) AS number_of_book 
FROM
    book AS b
    inner    JOIN written_by AS w ON b.BOOKDESCID = w.BOOKDESCID
    LEFT JOIN author AS a ON w.AUTHORID = a.AUTHORID 
GROUP BY
    w.AUTHORID
HAVING
    number_of_book > 3

SELECT author.first_name, author.last_name, COUNT(book.id) AS book_count
FROM book
JOIN written_by ON book.id = written_by.book_id
JOIN author ON written_by.author_id = author.id
GROUP BY author.first_name, author.last_name
HAVING COUNT(book.id) >= 3;

sql最后的用别名是不对的,
sql的执行顺序 having在select之前,
你用别名在having识别不到
改成这样你试试

SELECT a.FIRSTNAME,a.LASTNAME
,b.title as name_of_book
,count(b.title) as number_of_book
FROM book as b
left join written_by as w
on b.BOOKDESCID = w.BOOKDESCID
left join author as a
on w.AUTHORID = a.AUTHORID
Group by a.FIRSTNAME
HAVING count(b.title) > 3

1、group by 改用 authorid,用firstname可能会有重名的;
2、如果3本以上包括3本的话having 后面用>=3 或>2;