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;
    
我试图获取包含以下信息的数据:

  • 书号
  • 书名
  • 作者姓名
  • 我的查询没有返回相关数据,我可能在某个地方错过了正确的连接,但正如我所看到的,最大的问题是我的理解。如果有人能按我所见检查所做事情的后果,我将不胜感激:

  • 指定我在视图中需要的确切列:
  • 在book_id上联接数据透视表:
  • 因为我需要作者的名字,所以我又加入了一个join,将authors表带入游戏:
  • 因此,最后我有以下问题

    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