2012-09-24 74 views
0

所以我是MySQL的新手,并且遇到了一些麻烦。我有一张名为book_genres的表格,另一张名为book。需要帮助使用SELECT DISTINCT结果搜索MySQL数据库

book_genres 
+-------+---------+ 
|book_id| genre | 
+-------+---------+ 
| 1  | Horror | 
| 1  | Comedy | 
| 2  | Romance | 
| 2  | Comedy | 
+-------+---------+ 

books 
+-------+---------+ 
|book_id| title | 
+-------+---------+ 
| 1  | A Book | 
| 2  | B Book | 
| 3  | C Book | 
+-------+---------+ 

我使用下面的命令把所有具有3个选择流派book_ids:

SELECT DISTINCT a.book_id, b.genre AS genre1, c.genre AS genre2, d.genre AS genre3 
FROM book_genres a 
JOIN book_genres b ON a.book_id = b.book_id AND b.genre LIKE 'Romance' 
JOIN book_genres c ON a.book_id = c.book_id AND c.genre LIKE 'Action' 
JOIN book_genres d ON a.book_id = d.book_id AND d.genre LIKE 'Comedy' 
GROUP BY book_id 

我想要做的就是现在用的拉所有书名从书本上表什么在此搜索中找到book_ids。我不确定是否有更简单的方法来做到这一点,但这是我所能想到的。

谢谢任何​​人谁可以帮忙!

+1

由于您在'LIKE'子句中没有使用任何通配符,它​​们是否真的需要'LIKE'?另外,根据上面的示例数据,您的查询不会返回任何结果。没有'book_id'与相应的行的浪漫,动作和喜剧类型。 – Adrian

回答

1

我认为这可能是一个更好的办法:

select b.* 
from books b join 
    book_genres bg 
    on b.bookid = bg.bookid 
where bg.genre in ('Romance', 'Action', 'Comedy') 
group by b.book_id 

这将选择有三大流派之一的所有书籍。您的查询不清楚您是要在流派之间“或”还是“和”,所以我假设为“或”。

该组通过使用称为“隐藏列”的MySQL功能。它在这种情况下表现得很明显。

如果你需要有三个流派所有的书,你可以这样来做:

select b.* 
from books b join 
    (select book_id 
     from book_genre 
     group by book_id 
     having max(case when genre = 'Romance' then 1 else 0 end) > 0 and 
      max(case when genre = 'Action' then 1 else 0 end) > 0 and 
      max(case when genre = 'Comedy' then 1 else 0 end) > 0 
    ) allg 
    on b.book_id = allg.book_id 
+0

这只是拉动所有具有浪漫,动作或喜剧类型的书籍。我需要它只有3本书,而不仅仅是3本书之一。 – user1695645

+0

第二个是真棒!非常感谢!比我尝试过的要快得多。 – user1695645

0

你可以做一个子查询,像这样:

SELECT books.title 

FROM books 

WHERE books.book_id 
IN (
SELECT 
    a.book_id 

FROM 
    book_genres a 
    JOIN book_genres b ON a.book_id = b.book_id AND b.genre LIKE 'Romance' 
    JOIN book_genres c ON a.book_id = c.book_id AND c.genre LIKE 'Action' 
    JOIN book_genres d ON a.book_id = d.book_id AND d.genre LIKE 'Comedy' 

GROUP BY book_id 
) 
+0

这是我最初的想法,但数据库非常大,这个查询需要很长时间才能产生结果。 – user1695645

0

那么你会踢自己作为快速和肮脏的答案是

SELECT DISTINCT a.book_id, a.book_title, 
b.genre AS genre1, c.genre AS genre2, d.genre AS genre3 
FROM book_genres a 
JOIN book_genres b ON a.book_id = b.book_id AND b.genre = 'Romance' 
JOIN book_genres c ON a.book_id = c.book_id AND c.genre = 'Action' 
JOIN book_genres d ON a.book_id = d.book_id AND d.genre = 'Comedy' 
GROUP BY book_id 

已换像=看到,因为你不使用通配符

还有其他一些方法可以做到这一点我认为,但是他们中的任何一个都不会像你的努力那样容易理解,而且我也很难确定他们会表现得更好,所以除非表现糟糕,用book_genres的流派专栏的索引来解决,我个人坚持这一点。