2017-09-15 56 views
1

好的,所以我有一個問題。MySQL刪除值如果存在另一行

我有一個多對多的關係作者&書創建了一個我已經命名爲CoverPage的Junction表。

Author: 
AuthorID 
AuthorName 

CoverPage: (Junction Table) 
AuthorID 
BookID 

Book: 
BookID 
BookTitle 
BookType 

問題:創建一個顯示誰寫了一個小說類的書,但不顯示誰創造了一個歷史書作者的任何所有作者聲明。

例如:

AuthorName:  BookName:   Book Type: 
John Smith  The Awakening  Fiction 
John Smith  WW2     Historical 
Jack Johnson The last Alien  Fiction 

查詢應只顯示傑克·約翰遜,因爲約翰·史密斯,即使他創造了他還創造了一個歷史的書,但不幸的是在我的查詢,他仍然會出現一個虛構的書。

喜歡的東西:

Select distinct AuthorName 
From Author, Book, CoverPage 
Where Author.AuthorID=CoverPage.AuthorID 
And Book.BookID=CoverPage.BookID 
And BookType = 'Fiction' And Not BookType = 'Historical'; 

或者

SELECT distinct AuthorName, EmailAddress 
FROM Author 
LEFT JOIN CoverPage ON Author.AuthorID = CoverPage.Author_AuthorID 
LEFT JOIN Book ON CoverPage.Book_BookID = Book.BookID 
Where Not BookType = 'Historical' 
Group By AuthorID; 

這裏是我的表:

CREATE TABLE IF NOT EXISTS `Publisher` (
`PublisherID` VARCHAR(3) NOT NULL, 
`PublisherName` VARCHAR(30) NULL, 
`City` VARCHAR(15) NULL, 
`ContactNumber` VARCHAR(10) NULL, 
PRIMARY KEY (`PublisherID`)) 
ENGINE = InnoDB; 

CREATE TABLE IF NOT EXISTS `Author` (
    `AuthorID` INT NOT NULL, 
`AuthorName` VARCHAR(20) NULL, 
`EmailAddress` VARCHAR(25) NULL, 
PRIMARY KEY (`AuthorID`)) 
ENGINE = InnoDB; 

CREATE TABLE IF NOT EXISTS `Book` (
`BookID` INT NOT NULL, 
`BookTitle` VARCHAR(30) NULL, 
`BookType` VARCHAR(10) NULL, 
`Price` FLOAT NULL, 
`PaperBack?` VARCHAR(5) NULL, 
`Publisher_PublisherID` VARCHAR(3) NOT NULL, 
PRIMARY KEY (`BookID`), 
INDEX `fk_Book_Publisher1_idx` (`Publisher_PublisherID` ASC), 
CONSTRAINT `fk_Book_Publisher1` 
FOREIGN KEY (`Publisher_PublisherID`) 
REFERENCES `Publisher` (`PublisherID`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


CREATE TABLE IF NOT EXISTS `CoverPage` (
`Book_BookID` INT NOT NULL, 
`Author_AuthorID` INT NOT NULL, 
PRIMARY KEY (`Book_BookID`, `Author_AuthorID`), 
INDEX `fk_Book_has_Author_Author1_idx` (`Author_AuthorID` ASC), 
INDEX `fk_Book_has_Author_Book1_idx` (`Book_BookID` ASC), 
CONSTRAINT `fk_Book_has_Author_Book1` 
FOREIGN KEY (`Book_BookID`) 
REFERENCES `Book` (`BookID`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION, 
CONSTRAINT `fk_Book_has_Author_Author1` 
FOREIGN KEY (`Author_AuthorID`) 
REFERENCES `Author` (`AuthorID`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

insert into Publisher values ('P11','Eureka Publishing', 'Parramatta', '9981 3909'); 
insert into Publisher values ('P12','Lishpub Book Publishing', 'Penrith', '9971 3000'); 
insert into Publisher values ('P13','The Publisher Corp', 'Gosford', '9931 2999'); 
insert into Publisher values ('P15','Stewart Publishing', 'Bankstown', '9931 7000'); 
insert into Publisher values ('P14','George Street Publishing', 'Sydney CBD', '9981 4111'); 
insert into Author values (321, 'Barry White', '[email protected]'); 
insert into Author values (322, 'Bill Cosby', '[email protected]'); 
insert into Author values (323, 'George Ryan', '[email protected]'); 
insert into Author values (324, 'Jon Snow', '[email protected]'); 
insert into Book values (4321, 'The Awakening', 'Historical', '20.00', 'yes', 'P11'); 
insert into Book values (4322, 'Indianna Jones', 'Fiction', '30.00', 'yes', 'P12'); 
insert into Book values (4324, 'Star Wars', 'Fiction', '20.00', 'yes', 'P14'); 
insert into Book values (4323, 'The Lost Magic', 'Education', '10.00', 'no', 'P13'); 
insert into Book values (4325, 'World War', 'Historical', '20.00', 'yes', 'P14'); 
insert into Book values (4326, 'Doctor No', 'Fiction', '25.00', 'yes', 'P12'); 
insert into Book values (4327, 'Spiderman', 'Fiction', '10.00', 'no', 'P12'); 
insert into CoverPage values (4321, 321); 
insert into CoverPage values (4321, 323); 
insert into CoverPage values (4324, 322); 
insert into CoverPage values (4325, 322); 
insert into CoverPage values (4324, 323); 
insert into CoverPage values (4326, 323); 
insert into CoverPage values (4327, 323); 
insert into CoverPage values (4327, 324); 

回答

1

您可以通過使用NOT IN並獲得具有所有作者的名單這樣做寫下歷史書籍並將它們排除在主要查詢之外。

SELECT DISTINCT 
    a.AuthorName 
FROM Author a 
JOIN CoverPage cp on cp.author_AuthorID = a.AuthorID 
JOIN Book b on cp.book_BookID = b.BookID 
WHERE b.BookType = 'Fiction' 
AND a.AuthorID NOT IN 
    (SELECT cp.author_AuthorID 
    FROM CoverPage cp 
    JOIN Book b ON cp.book_BookID = b.BookID 
    WHERE BookType = 'Historical') 

SQL Fiddle

+0

無返回值中不幸:( – Dion

+0

伊夫更新我原來的職位,所以你可以看到我的表:) – Dion

+0

@Dion編輯我的回答。請檢查 – SQLChao

1

考慮NOT EXISTS條款:

​​
+0

試過這個但沒有值出現,但我三重值檢查插入的東西絕對應該出現 – Dion

+0

請設置一個[最小,完整和可驗證的例子](https://meta.stackoverflow.com/q/333952/1422451)與數據並使用[rextester](http://rextester.com/)或[sqlfiddle](http://sqlfiddle.com/),選擇* MySQL *語言。使用工作臺/控制檯中的「SHOW CREATE TABLE」。 – Parfait

+0

好吧,所以我創建了我的模式,是的,仍然沒有結果。我如何向你展示我的桌子?對不起,我是一個noob :( – Dion

相關問題