如何删除MySQL查询中未使用的重新编码的行

时间:2018-08-13 10:19:17

标签: mysql sql database

我有2个表:BooksAuthors

这是我的SQL查询,用于显示书籍及其作者:

SELECT * FROM `tbl_books`, `tbl_author` WHERE `tbl_books`.`id` = `tbl_author`.`author_id`

我的问题是,有100多位作者,但只有少数人拿着一本书, 因此我想删除其余没有多少本书的作者。我该怎么办?

3 个答案:

答案 0 :(得分:0)

编写此查询的正确方法是:

SELECT *  -- you should be explicit about the columns here
FROM tbl_books b JOIN
     tbl_author a
     ON b.id = a.author_id;

注意:

  • 从不FROM子句中使用逗号。 始终使用正确的,明确的,标准 JOIN语法。
  • 表别名使查询更易于编写和阅读。
  • 您的查询看起来非常可疑。我认为JOIN条件应为b.author_id = a.author_id

此查询(和您的查询)将不返回没有书籍的“作者”行。但是,如果您实际上要删除这些行:

delete a from tbl_authors a
    where not exists (select 1 from tbl_books b where b.author_id = a.author_id);

但是,您似乎不太可能拥有一个包含作者和书籍的数据库,但是authors表中的行没有书籍。

答案 1 :(得分:0)

我同意加入条件应为b.author_id = a.author_id

您可以尝试以下SQL查询,使用LEFT JOIN和NOT IN函数

DELETE FROM tbl_author a
 WHERE a.author_id NOT IN (SELECT b.author_id 
                        FROM tbl_books b);

使用LEFT JOIN的另一种方式

DELETE a FROM tbl_author a 
  LEFT JOIN tbl_books b ON a.author_id = b.author_id
      WHERE b.author_id IS NULL;

答案 2 :(得分:0)

问题已解决 使用NOT IN删除未使用的记录

tbl_authortbl_author的地方删除。author_id不在(选择author_id的{​​{1}})