如何选择表中不在其他表中的行

时间:2014-08-24 13:47:48

标签: mysql sql database join notin

我在选择既不翻译书籍,又没有翻译书籍的书籍时感到烦恼。也没有预定部分。结构看起来像this。 (抱歉,stackoverflow不会让我发布一个声誉低于10的图片)

它使用共享主键class inheritance design pattern

这是我到目前为止所提出的:

SELECT *
FROM (
        (
            (`hedwig_db`.`refs` JOIN `hedwig_db`.`books` 
                        ON `refs`.`ref_id`=`books`.`ref_id`
            )
        LEFT JOIN `hedwig_db`.`authors`
                ON `refs`.`ref_id` =  `authors`.`ref_id`
        )
    LEFT JOIN `hedwig_db`.`editors`
            ON `books`.`book_id`=`editors`.`book_id`
    )
WHERE `books`.`book_id`
NOT IN (SELECT `books`.`ref_id`,
                `books`.`book_id`,
                `book_section`.`book_id`,
                `book_translated`.`book_id`,
                `book_series`.`book_id`
        FROM(
                (
                    (`hedwig_db`.`books` JOIN `hedwig_db`.`book_translated`
                        ON `books`.`book_id`=`book_translated`.`book_id`
                    )
                JOIN `hedwig_db`.`book_section`
                    ON `books`.`book_id`=`book_section`.`book_id`
                )
            JOIN `hedwig_db`.`book_series`
                ON `books`.`book_id`=`book_series`.`book_id`
            )
    )

NOT IN查询没有返回任何内容,我不能为我的生活找出如何获得我正在寻找的东西!在此先感谢:)

1 个答案:

答案 0 :(得分:0)

我会简化where子句以使用not exists

SELECT *
FROM `hedwig_db`.`refs` r JOIN
     `hedwig_db`.`books` b 
     ON r.ref_id = b.ref_id LEFT JOIN
     `hedwig_db`.`authors` a
     ON r.ref_id =  a.ref_id LEFT JOIN
     `hedwig_db`.`editors` e
     ON b.book_id = e.book_id
WHERE NOT EXISTS (select 1 from `hedwig_db`.`book_translated` bt where bt.book_id = b.book_id) and
      NOT EXISTS (select 1 from `hedwig_db`.`series` bs where bs.book_id = b.book_id) and
      NOT EXISTS (select 1 from `hedwig_db`.`book_sections` bs where bs.book_id = b.book_id);

你的not in条款正在加入这些表格,所以它会找到三本书。你可以改为union all,但我会坚持三种不同的条件。