【问题标题】:How to write a "shortest path" like command or at least a "find a path" command in MYSQL?如何在 MYSQL 中编写类似“最短路径”的命令或至少是“查找路径”命令?
【发布时间】:2018-10-15 07:36:26
【问题描述】:

成像,这样的表格中有社交媒体数据:

u1 u2
0  3
1  2
1  4
2  3
3  1
3  4

意思是:

  • 用户 0 关注用户 3
  • 用户 1 关注用户 2
  • 用户 1 关注用户 4
  • ...

现在我想知道:有没有从用户 0 到用户 2 的方式/路径?

是的。用户 0 关注用户 3。用户 3 关注用户 1。用户 1 关注用户 2。

但是如何用 SQL 命令解决这个问题呢?

我想知道是否有这样的路径。可选我想知道路径是什么。是否有可能以某种方式获得最短路径?

【问题讨论】:

  • MySQL 并不真正支持分层或递归查询。您可以使用存储过程,使用递归或 while 循环来做到这一点。
  • 什么版本的 MySQL?在 MySQL 8.x 中可以做到这一点,但在 MySQL 5.x 中则不行。

标签: mysql sql


【解决方案1】:

以下查询在 MySQL 8.x 中有效,因为它需要“递归公用表表达式”(递归 CTE):

with n (initial, path, current) as (
  select u1, concat('', u1, '/', u2), u2  from my_table 
    where u1 = 0 -- initial node
  union all 
  select n.initial, concat(n.path, '/', m.u2), m.u2
    from my_table m
    join n on n.current = m.u1
)
select * from n 
  where current = 2 -- target node

但是,如果您使用的是 MySQL 5.x,那么您就不走运了(据我所知)。

【讨论】:

    猜你喜欢
    • 2019-08-03
    • 1970-01-01
    • 2012-04-07
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 2023-03-21
    • 2013-10-26
    相关资源
    最近更新 更多