我需要能够获取位置列表并确定配对它们的最佳方式,以便配对中每个位置之间的距离最低
我制作了一个给出位置列表的脚本
22个位置的列表产生231对的列表。
使用此生成的列表,如下所示:
address1, address2, dist
我需要找出它们之间的距离最低的11个最佳对。此列表还必须包括所有原始22个位置,每个位置仅在列表中出现一次。
**我正在寻找一种采用SQL查询,PHP或两者的解决方案
提前致谢!
答案 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
你可以尝试使用你的数据,它应该工作。