编写SQL查询搜索

时间:2014-05-21 08:39:52

标签: sql oracle search

我需要编写一个sql查询,该查询将查找至少有2本不同书籍(book1,book2和book3)的用户。可以使用什么技术来编写这样的查询?

我想找到拥有指定图书集中至少2本图书的所有用户(' book_1',' book_2',#39; book_3')但是不要拥有第二组指定的任何书籍(' book_4')?

Example

修改

OP无法解释他实际上在寻找什么。 OP实际上想要做的是:

查找拥有至少2本不同图书的所有用户排除拥有名为' book_4'的图书的用户。

2 个答案:

答案 0 :(得分:4)

试试这个:

SELECT Users,Count(DISTINCT Books) as CountOfBooks
FROM TableName
GROUP BY Users
HAVING COUNT(DISTINCT Books) >= 2

<强>解释

在这里,我们将表内容与用户字段分组,并计算每个用户拥有的不同书籍的数量。 HAVING子句有助于使用不同书籍的计数过滤结果。

您可以使用所需的计数更改数字2。 =可用于完全匹配,而不是至少。

请参阅SQL Fiddle中的示例。

修改

要使用book_4排除用户,请尝试以下操作:

SELECT Users,Count(DISTINCT Books) as CountOfBooks
FROM TableName
WHERE Users NOT IN (SELECT Users FROM TableName WHERE Books = 'book_4')
GROUP BY Users
HAVING COUNT(DISTINCT Books) >= 2

更快的版本(不使用IN):

SELECT T1.Users,Count(DISTINCT T1.Books) as CountOfBooks
FROM TableName T1 LEFT JOIN
(SELECT Users 
 FROM TableName 
 WHERE Books = 'Book4') T2 ON T2.Users=T1.Users
WHERE T2.Users IS NULL
GROUP BY T1.Users
HAVING COUNT(DISTINCT T1.Books)>=2

SQL Fiddle中的示例。

答案 1 :(得分:2)

试试这个,

select USERS,count(distinct BOOKS) from myTable
where BOOKS in('Book1','Book2','Book3')
group by USERS
having count(distinct BOOKS) >=2