我正在尝试为此问题编写查询:
撰写查询,仅选择所有作者都属于印度国籍的图书。
,其中
我正在尝试使用内部联接组合两个查询但是它给出了错误..
我的查询是..
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
答案 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)
你距离正确答案还不到一百万英里;你只需要 -
创建一个外部查询,从加入两个子查询的结果中选择book_id
;
将A
子查询的左括号移到子查询的开头;
在每个子查询的选择列表中包含book_id
;以及
加入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(*)