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

时间:2012-01-28 08:09:02

标签: php sql

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


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

  1. 创建一系列唯一配对
  2. 对于每一对,它会查询API以了解该对位置之间的距离
  3. 22个位置的列表产生231对的列表。

    使用此生成的列表,如下所示:

    address1, address2, dist
    

    我需要找出它们之间的距离最低的11个最佳对。此列表还必须包括所有原始22个位置,每个位置仅在列表中出现一次。

    **我正在寻找一种采用SQL查询,PHP或两者的解决方案

    提前致谢!

3 个答案:

答案 0 :(得分:1)

想出来。该解决方案首先查看最短距离,然后如果之前没有使用过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>';
    }
}

答案 1 :(得分:0)

它非常复杂,如果每行都分配了某种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

答案 2 :(得分:0)

SELECT address1, address2, dist, INSTR( @a , CONCAT( '--', address1 ) ) AS add1, INSTR( @a , CONCAT( '--', address2 ) ) AS add2, @a , @a := CONCAT( @a , '--', address1, '--', address2 )
FROM `data`
HAVING add1 =0
AND add2 =0
ORDER BY DIST
LIMIT 0 , 30

你可以尝试使用你的数据,它应该工作。