sql:group by和子句问题

问题描述:

我有3个表obl_books,obl_authors和链接表books_authors。 现在的问题是: 撰写一个查询,只选择那些所有作者都属于印度国籍的书籍。sql:group by和子句问题

,我写了这个查询是

SELECT obl_books.*, books_authors.author_id 
    FROM books_authors,obl_authors,obl_books 
    WHERE books_authors.author_id = obl_authors.author_id 
    AND books_authors.book_id=obl_books.book_id 
    GROUP BY books_authors.book_id 
    HAVING books_authors.author_id IN (SELECT obl_authors.author_id FROM obl_authors WHERE nationality='Indian') 

国籍是obl_authors表的列和一本书可以有多个作者。所以如果book_id(2)有author_id(1),author_id(2)其中author_id(1)和(2)是印第安人,那么它应该返回,如果作者之一不是印度人,它不应该。 。

但我的查询甚至返回book_id。

我甚至用到位的所有关键字变化having子句我的,但它不返回任何行..

请帮助:(

+0

为什么按分句? – Ravi

+0

用示例数据发布表结构 – Akhil

试试这个查询:

SELECT obl_books.*, books_authors.author_id 
    FROM books_authors,obl_authors,obl_books 
    WHERE books_authors.author_id = obl_authors.author_id 
    AND books_authors.book_id=obl_books.book_id and obl_authors.nationality='Indian' 
    GROUP BY books_authors.book_id 
    HAVING count(books_authors.book_id) = (SELECT count(*) FROM books_authors group by books_authors.author_id) 
+0

它不起作用..即使有一个作者是印度人,它也会提供所有这些书目ID ..但是我只想要那些其作者都是印度人的book_id – xyz

+0

我看到了,我已经改变了查询。试试另一个。 –

+0

[看起来不起作用](http://sqlfiddle.com/#!2/94f74/8)。 –

我认为,我们可以做到这一点...以相反的方式也..首先得到所有的作者身份证,谁是不是印度人,然后除了那些作者选择所有剩余的作者的书(印度作者的书)

SELECT obl_books.*, books_authors.author_id 
    FROM books_authors,obl_authors,obl_books 
    WHERE books_authors.author_id = obl_authors.author_id 
    AND books_authors.book_id=obl_books.book_id AND books_authors.author_id NOT IN (SELECT obl_authors.author_id FROM obl_authors WHERE nationality<>'Indian') 
+0

它不工作..即使有一个作者是印度人,它给出所有这些书ID ..但我只想要那些book_id其中所有的作者是印度 – xyz

+0

检查现在..更新的答案。 – Ravi

+0

[看起来不起作用](http://sqlfiddle.com/#!2/94f74/7)。 –

尝试:

SELECT obl_books.*, GROUP_CONCAT(books_authors.author_id) 
FROM books_authors 
JOIN obl_authors ON books_authors.author_id = obl_authors.author_id 
JOIN obl_books ON books_authors.book_id=obl_books.book_id 
GROUP BY books_authors.book_id 
HAVING MIN(obl_authors.nationality)='Indian' AND 
     MAX(obl_authors.nationality)='Indian' 
+0

ohh哇..它的工作..但你可以请解释... iam新到sql :( – xyz

+0

GROUP BY按book_id总结表,然后MIN和MAX检查是否(按字母顺序)第一个和最后一个国籍对于每本书都是'印度' - 这两个条件都是真实的,这意味着该书只能有印度作家。 –

+0

+1有趣的方法与最小/最大:) –

试试这个

select * from obl_books where id in (select book_id from books_authors where author_id in (select id from obl_authors where nationality='Indian')) 
+0

似乎没有工作。 –

据我了解你的问题,这是你想要的东西;它只是计算印度作者的数量是否与每本书的作者总数相同,并显示他们在哪里是平等的。

SELECT b.*, GROUP_CONCAT(a.author_id) authors 
FROM obl_books b 
JOIN books_authors ba ON b.book_id=ba.book_id 
LEFT JOIN obl_authors a ON ba.author_id=a.author_id AND a.nationality = 'Indian' 
GROUP BY b.book_id 
HAVING COUNT(a.author_id)=COUNT(ba.author_id) 

An SQLfiddle to test with

请注意,book_id上的GROUP BY只是一个MySQL主义,您通常需要按obl_books中的所有选定字段进行分组。