如何为每个组选择一个记录并将其与另一个表保持联接?

时间:2010-04-27 19:24:13

标签: mysql

我有一个表有两个位置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。

1 个答案:

答案 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