根据连接表计算SQL分数

时间:2015-09-16 23:26:40

标签: mysql sql mapreduce

我有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   |

因为迪伦是鲍勃和詹娜的朋友。

1 个答案:

答案 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
;

SQL Fiddle

我不确定你的意思是fit / map / reduce。也许其他人可以回答这一部分。