问题为显示写过 3 本书以上的作者的名字和姓氏。除了每个名字之外,还显示书籍的数量。
由三个表连在一起,book --- written_by --- author
然后这个是我目前写的以及出来的东西
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
对作者的authorid
、firstname
和lastname
进行分组。
使用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本书的作者。查询的结果将包含作者的名字、姓氏和书籍数量。
不知道你这个问题是否已经解决, 如果还没有解决的话: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
子句中包含所有需要显示的字段,即FIRSTNAME
和LASTNAME
,以便正确地分组作者。 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;