【问题标题】:MYSQL: How can i select a specific row in this situation?MYSQL:在这种情况下如何选择特定行?
【发布时间】:2020-10-15 23:36:06
【问题描述】:
SELECT name 
FROM books 
WHERE book_id IN (
    SELECT book_id 
    FROM details 
    WHERE lang IN ('English') 
    GROUP BY book_id 
    HAVING COUNT(book_id)=1
); 

我的details 表是这样的:

book_id 语言 1 英语 1 西班牙语 1 法语 2 英语 3 西班牙语 3 法语 4 德语 4 英语

我如何选择English 中编写的书籍,例如 book_id = 2?

当我编写我的代码时,我收到了哪个 book_id 包含“英语”语言,但我想获得恰好有 1 种语言的书,并且这种语言是“英语”。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    假设lang 永远不是null,使用HAVING 子句设置条件:

    SELECT name 
    FROM books
    WHERE book_id IN (
      SELECT book_id
      FROM details
      GROUP BY book_id
      HAVING SUM(lang <> 'English') = 0
    ) 
    

    【讨论】:

      【解决方案2】:

      你可以使用not exists:

      select b.*
      from books b
      where not exists (select 1
                        from details d
                        where d.book_id = b.book_id and
                              d.lang <> 'English'
                       );
      

      即:除了英语没有其他语言。

      注意:如果一本书没有详细信息,那么它也会被退回。如果你想避免这种情况,你可以使用聚合:

      select b.*
      from books b join
           details d
           using (book_id)
      group by b.book_id
      having min(lang) = 'English' and max(lang) = 'English';
      

      【讨论】:

        猜你喜欢
        • 2013-12-10
        • 2021-11-15
        • 2015-04-07
        • 1970-01-01
        • 1970-01-01
        • 2013-07-05
        • 1970-01-01
        • 2013-05-19
        • 1970-01-01
        相关资源
        最近更新 更多