0

我在选择既不是翻译书籍、书籍系列也不是书籍部分的书籍时有些麻烦。结构看起来像这样。(抱歉,stackoverflow 不允许我发布低于 10 名声望的图片)

它使用具有共享主键的类继承设计模式。

到目前为止,这是我想出的:

选择 *
从 (
        (
            (`hedwig_db`.`refs` JOIN `hedwig_db`.`books`
                        ON `refs`.`ref_id`=`books`.`ref_id`
            )
        左连接`hedwig_db`.`authors`
                ON `refs`.`ref_id` = `authors`.`ref_id`
        )
    左连接`hedwig_db`.`editors`
            ON `books`.`book_id`=`editors`.`book_id`
    )
WHERE `books`.`book_id`
不在(选择`books`.`ref_id`,
                `books`.`book_id`,
                `book_section`.`book_id`,
                `book_translated`.`book_id`,
                `book_series`.`book_id`
        从(
                (
                    (`hedwig_db`.`books` 加入 `hedwig_db`.`book_translated`
                        ON `books`.`book_id`=`book_translated`.`book_id`
                    )
                加入`hedwig_db`.`book_section`
                    ON `books`.`book_id`=`book_section`.`book_id`
                )
            加入`hedwig_db`.`book_series`
                ON `books`.`book_id`=`book_series`.`book_id`
            )
    )

这是 NOT IN 查询什么都不返回,我无法为我的生活弄清楚如何获得我正在寻找的东西!提前致谢 :)

4

1 回答 1

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,但我会坚持三种不同的条件。

于 2014-08-24T13:54:19.603 回答