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子句我的,但它不返回任何行..
请帮助:(
试试这个查询:
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)
它不起作用..即使有一个作者是印度人,它也会提供所有这些书目ID ..但是我只想要那些其作者都是印度人的book_id – xyz
我看到了,我已经改变了查询。试试另一个。 –
[看起来不起作用](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')
尝试:
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'
ohh哇..它的工作..但你可以请解释... iam新到sql :( – xyz
GROUP BY按book_id总结表,然后MIN和MAX检查是否(按字母顺序)第一个和最后一个国籍对于每本书都是'印度' - 这两个条件都是真实的,这意味着该书只能有印度作家。 –
+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'))
似乎没有工作。 –
据我了解你的问题,这是你想要的东西;它只是计算印度作者的数量是否与每本书的作者总数相同,并显示他们在哪里是平等的。
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)
请注意,book_id上的GROUP BY
只是一个MySQL主义,您通常需要按obl_books
中的所有选定字段进行分组。
为什么按分句? – Ravi
用示例数据发布表结构 – Akhil