2012-02-15 56 views
0

我得到了一些问题,这个查询我需要我所有的选择器,但我只想组aspnet_Users.Userid我应该怎么做?选择没有组按Sql

这里是我的查询:

SELECT 
    aspnet_Users.UserId, aspnet_Users.UserName, 
    Friends.Verified, Friends.FriendUserId 
FROM 
    [aspnet_Users] 
INNER JOIN 
    Friends ON Friends.UserId = aspnet_Users.UserId OR Friends.FriendUserId = aspnet_Users.UserId 
WHERE 
    aspnet_Users.UserId IN 
     (SELECT UserId as Id FROM Friends 
     WHERE FriendUserId='3d1224ac-f2ad-45d4-aa84-a98e748e3e57' 
     UNION 
     SELECT FriendUserId as Id FROM Friends 
     WHERE UserId='3d1224ac-f2ad-45d4-aa84-a98e748e3e57') 
GROUP BY 
    aspnet_Users.UserId, aspnet_Users.UserName, 
    Friends.Verified, Friends.FriendUserId 

存储过程结构:

[aspnet_Users]和[网友]

[aspnet_Users.UserId],[ aspnet_Users.UserName],[Friends.Verified],[Friends.FriendUserId]

这是我需要使用该程序的数据,但问题是每个用户都可以拥有多个朋友,这意味着如果有的话会有多个朋友值。这就是为什么我不能使用这些值进行分组的原因,因为它给我的发行人带来了错误的价值。

预期输出:

aspnet_Users.UserId(这是朋友的用户ID,请注意,这并不意味着它的FriendUserId)

aspnet_Users.UserName(这是基于上面解释的UserId的朋友的用户名)

Friends.Verified(对或错)验证值在友谊友表)

Friends.FriendUserId(从表友FriendUserId值)

+0

我不明白_why_要组只有用户ID。你能举出一个你想要的结果的例子吗? – 2012-02-15 08:33:10

+0

查看编辑问题 – parek 2012-02-15 08:39:12

+0

我明白,如果你通过aspnet_Users.UserId进行分组,它也将通过aspnet_Users.UserName进行分组。但是,如果不存在聚合函数,则无法分组。我想你想用命令。然而,预期的输出作为例子将有所帮助 – 2012-02-15 08:40:59

回答

1

如果你们的关系是没有在表中友完全互惠的,您可以使用此查询。

否则UNION的任一部分将在自己的工作

SELECT U.UserId, U.UserName, F.Verified, F.FriendUserId 
FROM Friends F 
JOIN aspnet_Users U ON U.UserId=F.UserId 
WHERE F.FriendUserId='3d1224ac-f2ad-45d4-aa84-a98e748e3e57' 
UNION 
SELECT U.UserId, U.UserName, F.Verified, F.FriendUserId 
FROM Friends F 
JOIN aspnet_Users U ON U.UserId=F.FriendUserId 
WHERE F.UserId='3d1224ac-f2ad-45d4-aa84-a98e748e3e57' 
+0

像魅力一样工作!谢谢。 – parek 2012-02-15 10:28:10

-1

您可以使用DISTINCT

SELECT DISTINCT 
    aspnet_Users.UserId, aspnet_Users.UserName, 
    Friends.Verified, Friends.FriendUserId 
FROM 
    [aspnet_Users] 
INNER JOIN 
    Friends ON Friends.UserId = aspnet_Users.UserId OR Friends.FriendUserId = aspnet_Users.UserId 
WHERE 
    aspnet_Users.UserId IN 
     (SELECT UserId as Id FROM Friends 
     WHERE FriendUserId='3d1224ac-f2ad-45d4-aa84-a98e748e3e57' 
     UNION 
     SELECT FriendUserId as Id FROM Friends 
     WHERE UserId='3d1224ac-f2ad-45d4-aa84-a98e748e3e57') 
+0

这与所有列上的分组相同。 – 2012-02-15 08:32:23

+0

正如Andreas所说,这就像所有列上的分组一样,所以这并没有解决我的问题。 – parek 2012-02-15 08:34:28

1

你需要组?您没有使用任何聚集函数(如求和,计数)

你还没有明确什么样的结果你要找的 - 我猜与给定用户连接的用户的所有细节,包括用户他们自己?

当然你可以这样做:

Select a.userid, a.username, f.verified, f.userid 
From aspnet_users a 
    Full outer join friends f on f.frienduserid = a.userid 
Where a.userid = @userid or f.frienduserid = @userid 
+0

问题是我得到重复然后..:/ – parek 2012-02-15 09:10:16

+1

所以你可以给一些输入数据的例子,你想要什么返回? – kaj 2012-02-15 09:17:05

+0

我的意思是说,乔是拥有该用户名的用户。如果他是比尔和莎莉的朋友,是否应该返回两条记录?在你的数据库中,你是否存储相互关系,即你的朋友桌上会有Joe-Bill,Joe-Sally,Bill-Joe和Sally-Joe记录? – kaj 2012-02-15 09:29:07