我有一个表有两个位置ID(pointa和pointb)以及它们相隔多远。多对可以相同的距离。
示例数据:
pointa pointb distance
1 2 250
3 4 250
4 5 250
.....
6 8 500
10 12 500
13 17 500
我想从每个距离类中选择一对(一个来自250,一个来自500,依此类推),然后将它们连接到另一个包含该位置属性的表。
如果我将此作为算法编写,它将会:
从表格距离的每个距离等级中随机选择一对 基于distance.pointa = data.location连接表数据。 然后为pointb做同样的事情,使得pointb = data.location
所以在加入之后,我最终得到了:
pointa pointb data_a data_b
1 2 234.5 440.2
有没有人对我如何实现这个目标有所了解?
现在我正在使用PHP(查找a的属性,然后是b,然后更新新表。显然这是低效的,我想学习更好的方法直接在MySQL中执行此操作。
TIA。
答案 0 :(得分:0)
在SQL中获取随机行可能效率低下。我会尝试类似的事情:
SELECT distance, GROUP_CONCAT(pointa) a, GROUP_CONCAT(pointb) b FROM mytable
GROUP BY distance;
然后在PHP中,
while($distance_points= $result->fetch_assoc()){
$distance=$distance_points['distance'];
$as=explode($distance_points['a']);
$random_a=array_rand($as,1);
$bs=explode($distance_points['b']);
$random_b=$bs[array_search($as,$random_a)]; //to get the pair assuming points don't repeat
echo "$distance $random_a $random_b";
}
ETA:由于GROUP_CONCAT的数据太多,多查询解决方案可能会更好。类似的东西:
SELECT DISTINCT distance FROM mytable ORDER BY distance; //get an array with the possible distances
foreach($distances as $d)
$q="SELECT distance, a, b FROM mytable WHERE distance=$d ORDER BY RAND() LIMIT 1";
//run query, retrieve single result and output or store
}
由于您希望获得有关您的位置a和b的额外信息,因此您可以将该加入添加到$q
。类似的东西:
SELECT distance, a, li1.gps, b, li2.gp2
FROM mytable m
JOIN location_info li1 ON (m.a=li1.id)
JOIN location_info li2 ON (m.b=li2.id)
WHERE distance=$d
ORDER BY RAND() LIMIT 1