我有3张桌子:
Users
| id | name |
---------------
| 1 | Bob |
| 2 | Dylan |
| 3 | Jenna |
Friendships
,这是友情关系的连接表
| user1_id | user2_id |
-----------------------
| 1 | 2 | // Bob and Dylan are friends
| 2 | 3 | // Dylan and Jenna are friends
Posts
| id | user_id | title | content |
-----------------------------------------------
| 1 | 1 | Bob's post | ... |
| 2 | 2 | Dylan's post | ... |
| 3 | 3 | Jenna's post | ... |
我想计算每个职位分数,分数公式如下:
score = (is_post_author_friend_of_user(X)) ? 2 : 1
其中X是user_id 是否有可能在纯SQL中实现这样的计算?当然,这意味着要检索多对多的关系数据 如果是的话,是否适合这份工作?这种情况下map / reduce怎么样?我可能会使用我不完全理解的术语。
如果Bob要求查看所有帖子,则分数如下:
| id | user_id | title | content | score |
-------------------------------------------------------
| 1 | 1 | Bob's post | ... | 1 |
| 2 | 2 | Dylan's post | ... | 2 |
| 3 | 3 | Jenna's post | ... | 1 |
因为鲍勃只是迪伦的朋友 但如果迪伦做同样的请求,分数将是:
| id | user_id | title | content | score |
-------------------------------------------------------
| 1 | 1 | Bob's post | ... | 2 |
| 2 | 2 | Dylan's post | ... | 1 |
| 3 | 3 | Jenna's post | ... | 2 |
因为迪伦是鲍勃和詹娜的朋友。
答案 0 :(得分:0)
是的,我相信这在纯SQL中是可行的。
你可以试试这个 - 它可能不是最快的,但似乎对我有用。
select
p.id,
p.user_id,
p.title,
p.content,
count(f.user1_id) + 1
from
Posts p
left outer join
Friendships f
on (f.user1_id = p.user_id and f.user2_id = 2) -- change the 2 to the requesting id.
or (f.user2_id = p.user_id and f.user1_id = 2) -- change the 2 to the requesting id.
group by
p.id,
p.user_id,
p.title,
p.content
;
我不确定你的意思是fit / map / reduce。也许其他人可以回答这一部分。