编写一个mysql查询以获取尚未在Networking上发布书籍的发布者名称

时间:2017-04-22 02:00:18

标签: mysql sql

我想写一个mysql查询,我们检索所有从未在网络上发布过书籍的出版商名称。

架构是:

publisher(pubisherid,publishername)

publishedby(bookdescid*,publisherid*,role)

subject(subjectid,subjecttype)

book(bookdescid,title,subtitle,edition,voltitle,volnumber,language,place,year,isbn,dewey,subjectid*)

writenby(bookdescid*,authorid*,role)

author(authorid,firstname,middlename,lastname)

1 个答案:

答案 0 :(得分:-1)

请尝试以下两个(或更多)具有相同publisherid的{​​{1}}值仍被视为不同发布商的内容...

publishername

此答案通过使用内部SELECT publisherid, publishername FROM publisher WHERE publisherid NOT IN ( SELECT DISTINCT publisherid FROM publisher JOIN publishedby ON publisher.publisherid = publishedby.publisherid JOIN book ON book.bookdescid = publishedby.bookdescid JOIN subject ON subject.subjectid = book.subjectid WHERE subject.subjecttype = 'Networking' ); 查询来选择SELECT上发布图书的每个publisherid(无重复)的列表。联接创建一个表,列出每个发布者发布的每本书(及其主题)。 Networking子句仅将其限制为WHERE上的那些图书。由于该出版商可能会有许多此类图书,因此可以选择其Networking的许多实例。我们可以通过在publisherid之前的DISTINCT在构成此列表的publisherid语句的初始部分中应用SELECT来为每个发布服务器创建一个实例。

外部查询将内部查询列表与Publisher表进行比较,并返回内部查询结果中不存在的publisherid的所有值,为我们提供了尚未Networking上发布图书的所有发布商的列表。

请尝试以下操作:一个发布商可以拥有多个publisherid值(但只有一个publishername值,但未与其他发布商共享)...

SELECT DISTINCT publishername
FROM publisher
WHERE publishername NOT IN ( SELECT DISTINCT publishername
                             FROM publisher
                             JOIN publishedby ON publisher.publisherid = publishedby.publisherid
                             JOIN book ON book.bookdescid = publishedby.bookdescid
                             JOIN subject ON subject.subjectid = book.subjectid
                             WHERE subject.subjecttype = 'Networking' );

id字段通常被视为实体的唯一标识符,并且往往具有更适合唯一标识符的表单(即INT,短字符串等) ,其他字段可以作为实体的唯一标识符。我修改了我的第一个语句,以便publishername作为单个发布者的唯一标识符。

publisherid已从要选择的字段列表中删除,因为您只询问了发布商名称列表,而不需要添加字段,这些字段可以提供有关该发布商的更多信息。

WHERE / NOT IN比较的字段也已更改为publishername。如果publisheridpublishername相关联,这将删除Networking / publishername组合的记录,这些记录包含 no Networking与之关联的图书在其他地方预订,以及Networking相关联的书籍的组合。

DISTINCT需要添加到本声明开头的publishername选择中,否则将会多次列出具有多个publisherid值的发布商。删除DISTINCT并将ORDER BY publishername添加到语句末尾(但在;之前)也可以实现相同的效果。

如果您有任何问题或意见,请随时发表评论。