编写一个mysql查询以获取尚未出版网络书籍的出版商名称
我想写一个mysql查询,检索所有从未出版过网络书籍的出版商名称 架构是:编写一个mysql查询以获取尚未出版网络书籍的出版商名称,mysql,sql,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*
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)
请尝试以下操作,其中具有相同publishername的两个或多个publisherid值仍被视为不同的发布者
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 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' );
这个答案的工作原理是使用内部选择查询来选择一个列表,其中列出了每一位出版过网络书籍的出版商。联接创建一个表,其中列出了每个出版商出版的每本书及其主题。WHERE条款将其仅限于那些关于网络的书籍。由于该出版商可能有许多此类书籍,因此可以选择其publisherid的许多实例。通过在构成此列表的SELECT语句的初始部分中应用DISTINCT BEFOR publisherid,我们可以为每个发布服务器获得一个实例
外部查询将内部查询的列表与Publisher表进行比较,并返回内部查询结果中不存在的publisherid的所有值,从而为我们提供一个尚未出版网络书籍的所有出版商的列表
请尝试以下操作,其中一个发布者可以有多个publisherid值,但只能有一个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 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 comparison的字段也已更改为publishername。这将消除具有publishername/publishername组合的记录,如果该publishername与其他地方的网络书籍相关联,则该组合没有与之关联的网络书籍,以及具有与之关联的网络书籍的组合
需要在本语句开头的publishername选择中添加DISTINCT,否则具有多个publisherid值的发布者将被多次列出。同样的效果也可以通过删除DISTINCT并将ORDER by publishername添加到语句末尾,但就在;之前来实现
如果您有任何问题或评论,请随时发表相应的评论。您肯定尝试过一些东西。您要求我们做作业的原因是什么?请参阅要提高问题的质量,请显示出版商、出版社、主题和书籍的示例数据,以及您期望样本数据产生的输出。此外,我建议您要么删除Writenby和author,要么更好地解释它们与手头的特定问题的关系。我在这篇文章中得到了额外的10行?如果您得到了额外的10行并询问原因,如果您描述它们会有所帮助-它们是重复的值还是其他突出的值?我可以尝试创建我自己的样本数据集,并尝试针对该数据集测试我的语句,但在不了解您正在使用的数据的情况下,我无法保证能够复制您遇到的问题。根据我对你问题的评论,如果你能提供一个示例数据集来说明这个问题,那么我和其他人将能够更好地测试我们的代码。您是否有不同的publisherid值和publishername的相同值?是的,我有不同的publisherid值和publishername的相同值,其中两个或多个publisherid值共享一个对应的publishername,我们应该将他们视为不同的出版商,还是将他们视为同一个出版商?