【问题标题】:Can this be solved with a single SQL query?这可以通过单个 SQL 查询来解决吗?
【发布时间】:2017-09-09 19:30:10
【问题描述】:

是否可以通过单个 SQL 查询来解决这个问题?有 4 个表:

  • 书(id、标题、东西)
  • 页面(id、book_id、东西)
  • syntax_error (id, page_id, fixed, something) (fixed - bool)
  • lexical_error(id、page_id、fixed、something)

book 表与page 表具有一对多关系。

单个page 可能包含syntax_errorlexical_error(对于此示例,不可能一页同时出现两个错误,而每页只有一个错误),因此page 具有一对一与syntax_errorlexical_error 的一种关系。

我怎样才能找到没有错误的所有书籍? (如何获取没有任何错误或任何非固定错误的页面的所有 book.id 值?)

通过使用一个 SQL 查询。

【问题讨论】:

    标签: mysql sql dml


    【解决方案1】:

    你可以使用NOT EXISTS

    SELECT id, title, ...
    FROM book AS b
    WHERE NOT EXISTS (SELECT 1
                      FROM page AS p
                      JOIN syntax_error AS se ON p.id = se.page_id
                      WHERE p.book_id = b.id)
          AND
          NOT EXISTS (SELECT 1
                      FROM page AS p
                      JOIN lexical_error AS le ON p.id = le.page_id
                      WHERE p.book_id = b.id)
    

    【讨论】:

    • 如果不是 mysql,我可能会使用它,因为我读过 mysql 与其他替代方案相比,not exists() 很难。不过,这仍然是一个很好的答案,+1。 NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: MySQL
    • @SqlZim 。 . .我认为union all 排除了索引的使用,所以这可能比那个版本快得多。
    【解决方案2】:

    使用not in()(删除了以前联合的not in(),因为它可能没有利用索引)

    select b.id
    from book b
    where b.id not in (
        select p.book_id 
        from page p
          inner join syntax_error se
            on p.id = se.page_id
           and se.fixed = 0
         )
      and b.id not in (
        select p.book_id 
        from page p
          inner join lexical_error le
            on p.id = le.page_id
           and le.fixed = 0  
        )
    

    【讨论】:

      【解决方案3】:
      select b.id
      from book b
      left outer join page p on p.book_id = b.id
      left outer join syntax_error s on s.page_id = p.id
      left outer join lexical_error l on l.page_id = p.id
      group by b.id
      having sum(case s.fixed when 0 then 1 else 0 end) = 0
      and sum(case l.fixed when 0 then 1 else 0 end) = 0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-25
        相关资源
        最近更新 更多