SQL - 查询以查找最受欢迎的朋友

时间:2017-01-12 23:59:36

标签: mysql sql

我在图表中有一个MySQL表边。我需要一个查询来查找给定人员中最受欢迎的朋友。有人可以帮帮我吗?以下是一些细节:

mysql> describe edges;
+--------------+--------------+------+-----+-------------------+----------------+
| Field        | Type         | Null | Key | Default           | Extra          |
+--------------+--------------+------+-----+-------------------+----------------+
| ID           | int(11)      | NO   | PRI | NULL              | auto_increment |
| from_node_id | int(11)      | NO   |     | NULL              |                |
| to_node_id   | int(11)      | NO   |     | NULL              |                |
+--------------+--------------+------+-----+-------------------+----------------+
3 rows in set (0.12 sec)

基本上,如果A有3个朋友,B,C和D - 我希望能够根据他们拥有的朋友的数量对A的朋友进行排名。基本上我可以找到最受欢迎的A朋友中的哪一个:)

如果可能,我不想使用嵌套查询来执行此操作,因此执行速度很快。桌子很大!

还有一个节点表,但我相信你不应该让它运行这个查询:)任何帮助将不胜感激!

编辑:以下是一些示例数据和示例结果:

示例输入表

+----+--------------+------------+
| id | from_node_id | to_node_id |
+----+--------------+------------+
|  1 |            1 |          2 |
|  2 |            1 |          3 |
|  3 |            1 |          4 |
|  4 |            5 |          2 |
|  5 |            6 |          2 |
|  6 |            7 |          3 |
+----+--------------+------------+

节点的示例输出表1.显示每个朋友的受欢迎程度

+---------+-------------+
| node_id | num_friends |
+---------+-------------+
|       2 |           3 |
|       3 |           2 |
|       4 |           1 |
+---------+-------------+

2 个答案:

答案 0 :(得分:1)

获取派生表中每个to_node_id的计数,并将其与原始表连接,以便在from_node_id上​​对其进行过滤。

select t.to_node_id,x.num_friends
from (select to_node_id,count(*) as num_friends
      from t 
      group by to_node_id) x
join t on t.to_node_id=x.to_node_id
where t.from_node_id=1
order by x.num_friends desc,t.to_node_id

使用self join进行此操作的另一种方法。

select t1.to_node_id,count(*) as num_friends
from t t1
join t t2 on t1.to_node_id=t2.to_node_id
where t1.from_node_id=1
group by t1.to_node_id
order by num_friends desc,t1.to_node_id

答案 1 :(得分:0)

这是你正在寻找的吗?

select e1.to_node_id as node_id, count(*) as num_friends
from edges e1
inner join edges e2 on e2.to_node_id = e1.from_node_id
where e1.from_node_id = 1
group by e1.to_node_id;