2013-07-23 98 views
0

我有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

回答

0

試試這個查詢:

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)。 –

0

我認爲,我們可以做到這一點...以相反的方式也..首先得到所有的作者身份證,誰是不是印度人,然後除了那些作者選擇所有剩餘的作者的書(印度作者的書)

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)。 –

1

嘗試:

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有趣的方法與最小/最大:) –

0

試試這個

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

似乎沒有工作。 –

1

據我瞭解你的問題,這是你想要的東西;它只是計算印度作者的數量是否與每本書的作者總數相同,並顯示他們在哪裏是平等的。

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中的所有選定字段進行分組。