如何从左外连接中找到具有 AND 条件的完全匹配项

How to find exact match item with AND condition from left outer join

我有一个MySQLtable
书table

+--------+-------------+-----+  
| bookno | bookname    | ... |  
+--------+-------------+-----+  
| 1      | FINALFANTASY| ... |  
+--------+-------------+-----+  

作者table

+--------+-------------+-----+  
| bookno | Authorname  | ... |  
+--------+-------------+-----+  
| 1      | SQUARE      | ... |  
+--------+-------------+-----+  
| 1      | ENIX        | ... |  
+--------+-------------+-----+  

所以我想做一个搜索条件来获得与结果匹配的书。

我试试

select b.bookname,a.authorname from booktable as b 
left outer join authortable a on b.bookno = a.bookno
where a.authorname = "square" and a.authorname = "enix"

它只适用于 condition.but 当我尝试使用两个作者姓名时没有找到结果。我该怎么办?

(此查询适用于 "OR" 但不适用于 "AND" 但我真的想要匹配搜索条件的值,或者如果有一些不匹配但不为空的搜索条件,它不应该正在显示(所以或者在这种情况下不起作用)

使用聚合来确定哪些图书同时具有您想要的作者:

SELECT t1.bookname,
       t2.authorname
FROM booktable t1
INNER JOIN authortable t2
    ON t1.bookno = t2.bookno
INNER JOIN
(
    SELECT bookno
    FROM authortable
    WHERE authorname IN ('square', 'enix')
    GROUP BY bookno
    HAVING COUNT(DISTINCT authorname) = 2
) t3
    ON t1.bookno = t3.bookno

此处演示:

SQLFiddle

Tim Biegeleisen 的回答很好,但如果您需要完全匹配,以下最后一个 SQL 是正确的:

SELECT * FROM book;
SELECT * FROM author;

/* this SQL will return book's author name more than 2 also true */
SELECT b.bookname, a.authorname
FROM book AS b
JOIN author AS a ON b.bookno = a.bookno
JOIN (
  SELECT bookno FROM author
  WHERE authorname in ('SQUARE', 'ENIX')
  GROUP BY 1
  HAVING count(*) = 2
) AS a2 ON b.bookno = a2.bookno;

/* this sQL will return only 2 and all matched authors: */
SELECT b.bookname, a.authorname
FROM book AS b
JOIN author AS a ON b.bookno = a.bookno
JOIN (
  SELECT bookno FROM author
  WHERE authorname in ('SQUARE', 'ENIX')
  GROUP BY 1
  HAVING count(*) = 2
) AS a2 ON b.bookno = a2.bookno
JOIN (
  SELECT bookno FROM author 
  GROUP BY 1 
  HAVING count(distinct authorname) = 2
) AS a3 ON b.bookno = a3.bookno

PS1 - no need left join

PS2 - no need count distinct - unless your author table not design properly

If title is FANTASY genre is Adventure,fantasy, and search condition is

[ADVENTURE] = found

[FANTASY] = found

[ADVENTURE,FANTASY] = found

[ADVENTURE,FANTASY,ACTION] = not found

那么 SQL 将是:

SELECT b.bookname, a.authorname
FROM book AS b
JOIN author AS a ON b.bookno = a.bookno
JOIN author AS a1 ON b.bookno = a1.bookno AND a1.authorname = 'SQUARE'
JOIN author AS a2 ON b.bookno = a2.bookno AND a2.authorname = 'ENIX'

以上是有效的,我想知道是否有性能改进