MYSQL:在这种情况下如何选择特定行?

时间:2020-06-25 13:32:34

标签: mysql sql

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        lang
1            English
1            Spanish
1            French
2            English
3            Spanish
3            French
4            German
4            English

如何选择English中仅 写哪些书,例如book_id = 2?

当我编写代码时,我会收到book_id包含“英语” lang的语言,但是我想获得的书中的语言恰好是一种,而该语言是“英语”。

2 个答案:

答案 0 :(得分:0)

您可以使用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';

答案 1 :(得分:0)

假设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
)