如何在SQL中优雅地编写这个?

时间:2010-03-10 12:37:57

标签: sql mysql

我有一个包含用户信息的表(用户)。

我有另一个记录用户视图的表(userview) - 也就是说,当一个用户查看另一个用户详细信息时,我会记录查看者的ID以及他/她查看过的用户的ID。

我想写一个查询来帮助我回答这个问题:

获取查看SPECIFIED用户的用户查看过的所有用户的列表。

这似乎是一个直截了当的天真要求,但我想出的SQL(至少在我看来),太复杂了。我认为一个优雅的解决方案是在userview上使用自联接,并且(可能?)用户和用户视图之间的内部联接。

是否有任何SQL'诗人'可以帮助解决这个问题?

我正在使用mySQL 5.x,但理想情况下SQL应该是fb不可知的

2 个答案:

答案 0 :(得分:6)

让我们从“查看此用户的用户”开始:

select v1.viewer
from userview v1
where v1.viewee = @thisUserId

然后添加“被”查看过的用户:

select v2.viewee
from userview v1
inner join userview v2 on v2.viewer = v1.viewer
where v1.viewee = @thisUserId

然后添加用户表以从中获取数据:

select u.userid, u.someotherfields
from userview v1
inner join userview v2 on v2.viewer = v1.viewer
inner join user u on u.userid = v2.viewee
where v1.viewee = @thisUserId

答案 1 :(得分:2)

SELECT * 
    FROM userviews 
    WHERE viewer IN (
                   SELECT viewer 
                       FROM userviews 
                       WHERE viewed = 123)

子查询获取查看指定用户的查看者的ID(在本例中为123),整个查询只获取此查看者的所有行。