查找用户的兴趣,并在结果集中仅显示一次

时间:2014-07-02 09:19:36

标签: sql sql-server sql-server-2008-r2

我的数据库中有以下表格

包含用户的表格:

---------------------
| userId | username |
---------------------
| 1      | john doe |
| 2      | jane doe |
---------------------

“兴趣”列表

---------------------
| intId | interest  |
---------------------
| 1      | books    |
| 2      | cars     |
---------------------

我保存用户感兴趣的表格

--------------------
| userId | intId   |
--------------------
| 1      | 1       |
| 1      | 2       |
| 2      | 1       |
--------------------

现在我还有一个网页,我可以在其中选择一个或多个兴趣。基于我想要的 检索具有这些兴趣的用户。

所以假设我选择“书籍”和“汽车”。然后我应该得到两条记录,“jonh doe”和“jane doe”。

但问题是我不确定如何为此创建查询。我可以做一个简单的LEFT JOIN。但是之后 我会得到3条记录。由于“john doe”对“书籍”和“汽车”感兴趣。但我希望每个用户都只出现 一次在结果中。

那么我应该如何创建此查询呢?

5 个答案:

答案 0 :(得分:0)

Select username 
from   users u
join
(
Select distinct userid 
from table 
where intid in (1,2)
)t 
on t.userid = u.serid 

答案 1 :(得分:0)

如果您正在使用兴趣名称,则应使用DISTINCT执行此类操作:

SELECT DISTINCT u.UserName 
FROM Users u
INNER JOIN UserInterests ui ON ui.userId = u.userId
INNER JOIN Interest i on i.intId = ui.intId
WHERE i.Interest in ('books', 'cars')

如果您想根据兴趣ID进行操作:

SELECT DISTINCT u.UserName
FROM Users u
INNER JOIN UserInterests ui ON ui.userId = u.userId
WHERE ui.intId in (1,2)

答案 2 :(得分:0)

SELECT *,
    STUFF((SELECT DISTINCT ','+u.username
    FROM dbo.UserInterests ui
    INNER JOIN dbo.[user] u ON u.userid = ui.UserId
    WHERE ui.IntId=i.intId
    FOR XML PATH('')),1,1,'')
FROM dbo.Interests i

答案 3 :(得分:0)

以下是我首选的方法,它应该比在查询中使用SELECT DISTINCT运行得快一点。

SELECT U.UserName 
FROM Users AS U
WHERE 
EXISTS(
    SELECT 1
    FROM UserInterests AS UI 
    INNER JOIN Interest I on I.intId = UI.intId
    WHERE UI.userId = U.userId
        AND I.Interest in ('books', 'cars')
        )

答案 4 :(得分:0)

试试这个:

SELECT  DISTINCT U.UserName
FROM    Users AS U INNER JOIN
        UserInterest AS UI ON U.userId = UI.userId INNER JOIN
        Interests AS I ON UI.intId = I.intId