Php 找到根据距离配对位置的最佳方法

Php 找到根据距离配对位置的最佳方法,php,sql,Php,Sql,我需要能够获取位置列表,并确定最佳配对方式,以便配对中每个位置之间的距离最小 我制作了一个脚本,给出了一个位置列表 创建唯一对的数组 对于每一对,它都会查询一个API,以了解这对位置之间的距离 22个位置的列表生成231对的列表 使用生成的如下列表: address1, address2, dist 我需要找出11对最好的线,它们之间的距离最小。此外,该列表必须包括所有原始22个位置,每个位置仅在列表中出现一次 **我正在寻找一个使用SQL查询、PHP或两者兼用的解决方案 提前谢谢 它非常复

我需要能够获取位置列表,并确定最佳配对方式,以便配对中每个位置之间的距离最小


我制作了一个脚本,给出了一个位置列表

  • 创建唯一对的数组
  • 对于每一对,它都会查询一个API,以了解这对位置之间的距离
  • 22个位置的列表生成231对的列表

    使用生成的如下列表:

    address1, address2, dist
    
    我需要找出11对最好的线,它们之间的距离最小。此外,该列表必须包括所有原始22个位置,每个位置仅在列表中出现一次

    **我正在寻找一个使用SQL查询、PHP或两者兼用的解决方案


    提前谢谢

    它非常复杂,如果为每一行分配某种类型的Id,它会稍微简单一些。你可以考虑这样做来简化事情,但是用你所给的数据集,这是可行的。

    SELECT DISTINCT TOP 11  x.*
        FROM    (SELECT r.address1
                                , MIN(r.dist) AS dist
                    FROM    (SELECT   l.address1
                                    , l.address2
                                    , l.dist
                                FROM    locdist l
                            UNION ALL
                            SELECT    l.address2 AS address1
                                    , l.address1 AS address2
                                    , l.dist
                                FROM    locdist l
                        ) r
                    GROUP BY    r.address1
            ) y
            LEFT OUTER JOIN locdist x
                ON  x.dist = y.dist
                    AND
                    (x.address1 = y.address1
                    OR
                    x.address2 = y.address1)
        ORDER BY x.dist
    

    你可以用你的数据试试这个,它应该会起作用

    找到了答案。此解决方案首先查看最短距离,然后仅在以前未使用address1或address2的情况下输出该行

    while ($row = mysql_fetch_assoc($res))
    {
        // Assigning variables from cell values
        $address1 = $row['address1'];
        $address2 = $row['address2'];
    
        if(in_array($address1, $minDistance) OR in_array($address2, $minDistance)) {
    
        } else {
            $minDistance[] = $address1;
            $minDistance[] = $address2;
            echo $row['address1'] . '|' . $row['address2'] . '|' . $row['distance'] . '<br>';
        }
    }
    
    while($row=mysql\u fetch\u assoc($res))
    {
    //从单元格值分配变量
    $address1=$row['address1'];
    $address2=$row['address2'];
    if(在_数组中($address1,$MindDistance)或在_数组中($address2,$MindDistance)){
    }否则{
    $minDistance[]=$address1;
    $minDistance[]=$address2;
    回显$row['address1'].|'.$row['address2'.|'.$row['distance'.];
    }
    }
    
    对不起,我在第一次发布后才意识到它没有完全按照您的要求执行。我相信这个版本应该可以做到这一点。这个解决方案几乎可以工作,但它并不限制一个位置出现在多对中。每个位置都必须成对使用,一旦一个位置成对使用,就不能再使用了。啊,是的,我想它没有完全按照你的要求做,是吗。。。嗯,我不确定我将如何解决这个问题,看起来你已经有了解决方案,所以我想我不会担心。你能补充更多细节吗?不清楚您是想从内存中的PHP数组中查找这些对,还是将它们存储在DB中(带有API响应)。表结构也会有帮助。您可以按自己的方式限制行数
    while ($row = mysql_fetch_assoc($res))
    {
        // Assigning variables from cell values
        $address1 = $row['address1'];
        $address2 = $row['address2'];
    
        if(in_array($address1, $minDistance) OR in_array($address2, $minDistance)) {
    
        } else {
            $minDistance[] = $address1;
            $minDistance[] = $address2;
            echo $row['address1'] . '|' . $row['address2'] . '|' . $row['distance'] . '<br>';
        }
    }