开发者

How to write this elegantly in SQL?

I have a tab开发者_开发技巧le (user) that contains user information.

I have another table (userview) that records user views - that is, when one user views another users details, I record the id of the viewer and also, the id of the user he/she viewed.

I want to write a query that will help me answer the question:

Fetch the list of ALL users that were viewed by users that viewed a SPECIFIED user.

It seems a straight forward enough innocous requirement, but I am coming up with SQL that is (atleast to my mind), far too complicated. I think an elegant solution would use a self join on userview and (possibly?) an inner join between user and userview.

Are there any SQL 'poets' out there that can help with this?

I am using mySQL 5.x, but ideally the SQL should be fb agnostic


Lets start with "users that viewed this user":

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

Then add "users that were viewed by":

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

Then add the user table to get the data from it:

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


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

The subquery gets the ids of the viewers that looked at the specified user (in this case 123), the entire query simply gets all rows for this viewers.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜