在mysql中组合两个查询时出错

时间:2013-07-24 06:24:13

标签: 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(链接表)..我在这里尝试做的是在第一个查询中我正在检索author_id的行计数,其中国籍是来自obl_author表的印度为每个book_id

在第二个查询中,iam重新查找特定book_id的所有作者的行数。

我希望结合这两个查询来检查book_id的author_id的行数是否等于其总行数(从第二个查询中检索到的)...如果是,则检索该book_id。

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

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

你距离正确答案还不到一百万英里;你只需要 -

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

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

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

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

  5. 因此:

    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(*)