我想写一个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)
答案 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
。如果publisherid
与publishername
相关联,这将删除Networking
/ publishername
组合的记录,这些记录包含 no Networking
与之关联的图书在其他地方预订,以及做与Networking
相关联的书籍的组合。
DISTINCT
需要添加到本声明开头的publishername
选择中,否则将会多次列出具有多个publisherid
值的发布商。删除DISTINCT
并将ORDER BY publishername
添加到语句末尾(但在;
之前)也可以实现相同的效果。
如果您有任何问题或意见,请随时发表评论。