我有一个包含用户信息的表(用户)。
我有另一个记录用户视图的表(userview) - 也就是说,当一个用户查看另一个用户详细信息时,我会记录查看者的ID以及他/她查看过的用户的ID。
我想写一个查询来帮助我回答这个问题:
获取查看SPECIFIED用户的用户查看过的所有用户的列表。
这似乎是一个直截了当的天真要求,但我想出的SQL(至少在我看来),太复杂了。我认为一个优雅的解决方案是在userview上使用自联接,并且(可能?)用户和用户视图之间的内部联接。
是否有任何SQL'诗人'可以帮助解决这个问题?
我正在使用mySQL 5.x,但理想情况下SQL应该是fb不可知的
答案 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),整个查询只获取此查看者的所有行。