1

我有一个名为 users 的表,其中包含字段 id、电子邮件、用户名、名字和姓氏。

我有另一个名为 friends 的表,其中包含字段 id、user1、user2 和关系。

我在这个不应该那么难的连接查询上遇到了很大的困难:(。

我想找到尚未与您相关的最受欢迎的用户。例如,我已经生成了一个关系数组,我想查找用户信息以及他们拥有的与您不相关的用户的关系数量。

到目前为止,这是我的查询,但由于某种原因我无法让它工作。

select id, email,username,firstname,lastname
from users as userInformation
     left join (select count(*)
                from friends
                where friends.user1 = userInformation.id or friends.user2 = userInformation.id
               ) as x
where users.id NOT IN (2,44,26,33,1)

部分中的“2,44,26,33,1”not in是任意的,具体取决于登录的用户。
我无法正常工作的部分是左连接,它增加了关系计数。

只是为了提供帮助,这里有两个有效的查询。我只需要加入第二个作为每个用户第一个查询的列

 select id, email,username,firstname,lastname from users where id NOT IN (2,44,26,33,1)

 select count(*) from friends where user1 =2 or user2 = 2

但是第二个查询应该针对第一个查询中的每个 id。希望清除它。

这越来越近了

select id, email,username,firstname,lastname 
  from users as help
  left join (
      select count(*) 
        from friends 
       where user1 = help.id or user2 = help.id) as friendCounter
 where help.id NOT IN (2,44,26,33,1)

出于某种原因,它最终无法识别 where 子句中的 help.id。

4

3 回答 3

1

这个怎么样?

select userinformation.id, email,username,firstname,lastname,count(*)
from users as userInformation
     left join  friends on friends.user1 = userInformation.id or friends.user2 = userInformation.id

where userInformation.id NOT IN (2,44,26,33,1)
group by email,username,firstname,lastname
于 2012-06-27T19:21:21.540 回答
0
select * from (
    select id, email,username,firstname,lastname,count(*) N
        from users as userInformation
             left join  friends on friends.user1 = userInformation.id 
                                   or friends.user2 = userInformation.id

        where userInformation.id NOT IN (2,44,26,33,1)
        group by id,email,username,firstname,lastname) Aliased
order by N desc
于 2012-06-27T19:24:22.847 回答
0

我将按照我的理解重新表述您的问题陈述。让我知道它是否错了。

对于给定的用户,找到最受欢迎的不相关用户:

declare @GivenUser as varchar(20)
set @GivenUser = '1'  --replace '1' here with the user id you want

select id, email, username, firstname, lastname, Connections
from userInformation u1
inner join (
    select TheUser, count(*) as Connections
    from (
        select user1 as TheUser
        from friends
        where user1 <> @GivenUser
        and user2 <> @GivenUser

        union all

        select user2 as TheUser
        from friends
        where user1 <> @GivenUser
        and user2 <> @GivenUser
        ) u
    group by User
    order by sum(Connections) desc
    ) u2
on u1.id = u2.TheUser
于 2012-06-27T20:40:52.587 回答