2013-07-24 24 views
1

我正在嘗試爲此問題編寫查詢:在mysql中組合兩個查詢時出錯

編寫一個查詢以僅選擇所有作者都屬於印度國籍的書籍。

其中

我嘗試使用內連接來合併這兩個查詢,但它給一個錯誤..

我的查詢是..

SELECT COUNT(*) 
FROM (books_authors 
WHERE books_authors.author_id IN 
     (
      SELECT author_id 
      FROM obl_authors WHERE nationality='Indian' 
     ) GROUP BY books_authors.book_id) A 

INNER JOIN 
(
    SELECT COUNT(*) 
    FROM books_authors 
    GROUP BY books_authors.book_id 
) B 
ON A=B 

它給這個錯誤:

Error Code: 1064 
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where books_authors.author_id in (select author_id from obl_authors where nation' at line 1 

我有3個表obl_books,obl_authors和books_authors(鏈接表)..什麼ia m試圖在這裏做的是在第一個查詢中,我正在檢索author_id的行數,其中國籍是從obl_author表中爲每個book_id的印度

在第二個查詢iam中檢索特定book_id的所有作者的行計數。

我想結合這兩個查詢來檢查book_id的author_id的行數等於它的總行數(即iam從第二個查詢中獲取)。如果它然後檢索book_id。

在我做A = B,以檢查它的平等,但如何將我告訴它甚至檢索這些book_ids是否匹配(即A = B)

回答

0

你必須加入這些像一些列ON子句這樣的:

SELECT A.*, B.* 
FROM  
    (SELECT COUNT(*), books_authors.book_id FROM (books_authors WHERE books_authors.author_id IN (SELECT author_id FROM obl_authors WHERE nationality='Indian') GROUP BY books_authors.book_id) A 

    INNER JOIN 

    (SELECT COUNT(*), books_authors.book_id FROM books_authors GROUP BY books_authors.book_id) B 

    ON A.book_id = B.book_id 

要檢查它是否在數等於你其實並不需要加入的表,因爲你只是普通的號碼,這樣你就這樣做:

SELECT 
    (SELECT COUNT(*), books_authors.book_id FROM (books_authors WHERE books_authors.author_id IN (SELECT author_id FROM obl_authors WHERE nationality='Indian')) 
    - 
    (SELECT COUNT(*), books_authors.book_id FROM books_authors) 
+0

其不工作..我想檢查這兩個查詢的計數是否相等,而不是他們的book_id – xyz

+0

如果你的選擇單獨工作,那麼這個查詢也應該工作。至於你的要求...我更新了我的答案。不過,由於您沒有使用您分組的列,因此到目前爲止,分組沒有任何邏輯......分組可能會返回多於一行,因此您無法通過減去計數來檢查它們是否相等。或者你在密鑰上分組,然後在每對內進行比較,或者根本不分組:) :) –

+0

謝謝......我明白了我的錯誤:) – xyz

0

你不是密爾獅子遠離正確的答案;你只需要—

  1. 創建一個選擇加入您的兩個子查詢的結果book_id外查詢;

  2. A子查詢的左括號移到其子查詢的開頭;

  3. book_id包含在每個子查詢的選擇列表中;和

  4. 加入book_id和計數(我在下面的例子中使用NATURAL JOIN)。

這樣:

SELECT book_id FROM (
    SELECT book_id, COUNT(*) 
    FROM  books_authors 
    WHERE author_id IN (
      SELECT author_id 
      FROM obl_authors 
      WHERE nationality='Indian' 
      ) 
    GROUP BY book_id 
) A NATURAL JOIN (
    SELECT book_id, COUNT(*) 
    FROM  books_authors 
    GROUP BY book_id 
) B 

然而,實際上可以通過使用過濾器簡單的HAVING子句中的表之間的連接那裏更加簡單:沒有

SELECT b.book_id 
FROM  books_authors b 
    JOIN obl_authors a USING (author_id) 
GROUP BY b.book_id 
HAVING SUM(a.nationality='Indian') = COUNT(*) 
+0

但是,你能解釋一下自然連接在你的第一個答案中是如何工作的嗎? book_ids兩個子查詢的計數是相等的..我認爲應該出現一些相等的條件..我是新來的sql ..所以請解釋.. – xyz

+0

@aarti:'NATURAL JOIN'只需要在每一邊所有名稱相同的列的連接具有相同的值。這與'使用(book_id,\ COUNT(*)\')'或'ON A.book_id = B.book_id AND A. \ COUNT(*)\'= B'COUNT(*) \''(儘管在後一種情況下,連接將導致兩列名爲'book_id'和兩個名爲'COUNT(*)',所以選擇列表中的'book_id'在沒有表限定符的情況下是不明確的,而在其他情況下,這些列中只有一列)。 – eggyal

+0

哦,謝謝你說清楚:)現在我明白了 – xyz