我在图中有一个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/

10-09 00:50