我在图表中有一个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 |
+---------+-------------+
答案 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;