MySQL-请帮助修复查询中的错误
我有三个表,多对多关系:MySQL-请帮助修复查询中的错误,mysql,Mysql,我有三个表,多对多关系: 书 CREATE TABLE `books` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `title` VARCHAR(100) NOT NULL, `condition` ENUM('mint', 'new', 'medium', 'poor', 'needs replacement'), `
- 书
CREATE TABLE `books` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `title` VARCHAR(100) NOT NULL, `condition` ENUM('mint', 'new', 'medium', 'poor', 'needs replacement'), `date_added` DATE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
- 作者
CREATE TABLE `authors` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(50) NOT NULL, `pseudonim` VARCHAR(50) NOT NULL, `year_of_birth` INT(4) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
- 作者与图书表:
CREATE TABLE `authors_books` ( `author_id` INT(11) UNSIGNED NOT NULL, `book_id` INT(11) UNSIGNED NOT NULL, PRIMARY KEY (`author_id`, `book_id`), CONSTRAINT `fk1_authors_authors_id` FOREIGN KEY (`author_id`) REFERENCES `authors` (`id`) ON UPDATE CASCADE ON DELETE CASCADE, CONSTRAINT `fk2_books_book_id` FOREIGN KEY (`book_id`) REFERENCES `books` (`id`) ON UPDATE CASCADE ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
SELECT b.id, b.title, a.name FROM books as b
INNER JOIN authors_books as ab on b.id = ab.book_id
INNER JOIN authors AS a ON ab.authors_id = a.id
这给了我一个不完整的跳过大部分书籍的列表。我不明白这是怎么发生的。我犯的错误在哪里?我遗漏了什么概念?试试看
SELECT b.id, b.title, a.name FROM books as b
LEFT OUTER JOIN authors_books as ab on b.id = ab.book_id
LEFT OUTER JOIN authors AS a ON ab.authors_id = a.i
因为您缺少一些行,我认为您应该使用left-outer-join,这样您就可以获得针对@BUcorp提到的主表books的完整结果,主要问题是缺少行 要解决此问题,您可以使用
左连接
而不是内部连接
,以确保所有书籍都出现在结果中,即使它们没有作者或未知作者(如,在作者
中没有ID):
最后,为了避免在一本书有多个作者的情况下获得多个条目(如果在您的情况下可能发生这种情况),您可以使用
GROUP\u CONCAT(a.name)作为作者
和GROUP BY b.id
,我认为查询没有任何问题。你能给我们看一些样本数据,你得到的结果和你期望的结果吗?是的,你需要看到样本数据。你的代码看起来不错,你能通过一次查询得到你期望的结果吗?你能给我们看看例子吗?你的代码是正确的,问题来自你的数据,它只会返回它找到作者的书(使用authors\u books pivot表)。解决此问题的一种方法是使用左连接(在找不到作者时返回a.name=null
)。另外,如果书可以有多个作者,这是您的表允许的,那么这本书将在您的结果中出现好几次。很高兴有时有人不理解我:D有一个很好的作品。我不需要外部连接。虽然事实上,我应该将第二个JOIN语句更改为LEFT,但我明白,查询是否提取了您之前提到的所有缺失行?如果是这样的话,我建议您只需更改一下这个查询,例如添加ab.book_id不为null的位置。哈哈哈,谢谢您的提醒
INNER JOIN authors AS a ON ab.authors_id = a.id
SELECT b.id, b.title, a.name FROM books as b
INNER JOIN authors_books as ab on b.id = ab.book_id
INNER JOIN authors AS a ON ab.authors_id = a.id
SELECT b.id, b.title, a.name FROM books as b
LEFT OUTER JOIN authors_books as ab on b.id = ab.book_id
LEFT OUTER JOIN authors AS a ON ab.authors_id = a.i
SELECT b.id, b.title, a.name FROM books as b
LEFT JOIN authors_books as ab on b.id = ab.book_id
LEFT JOIN authors AS a ON ab.authors_id = a.i