1

我正在尝试为这个问题编写查询:

编写查询以仅选择所有作者都属于印度国籍的书籍。

其中

我正在尝试使用内部联接组合两个查询,但它给出了一个错误..

我的查询是..

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(链接表)..我在这里要做的是在第一个查询中,我正在从每个 book_id 的 obl_author 表中检索 author_id 的行数,其中国籍是印度人

在第二个查询中,我正在检索特定 book_id 的所有作者的行数。

我想结合这两个查询来检查 book_id 的 author_id 的行数是否等于它的总行数(我从第二个查询中检索)..如果然后检索该 book_id。

在 ON 子句中,我做了 A=B 来检查它的相等性,但是如果匹配(即 A=B),我将如何告诉它甚至检索那些 book_ids

4

2 回答 2

0

您必须将这些加入到这样的列中:

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)
于 2013-07-24T06:27:26.020 回答
0

你离正确答案不是一百万英里;你只需要——

  1. 创建一个外部查询,book_id从连接两个子查询的结果中选择;

  2. 将子查询的左括号A移到其子查询的开头;

  3. 包含book_id在每个子查询的选择列表中;和

  4. 加入两者book_id和计数(我NATURAL JOIN在下面的示例中使用 a )。

因此:

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(*)
于 2013-07-24T06:45:05.863 回答