我在图中有一个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 |
+---------+-------------+
最佳答案
获取派生表中每个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
关于mysql - SQL-查询以查找最受欢迎的 friend ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41625198/