MySql:查找table2.name WHERE table1.lat = table2.lat AND table1.lng = table2.lng;

时间:2011-09-29 01:19:46

标签: php mysql

过去几天我一直在努力寻找答案。 我有一张GPS数据路径表。和一个表。我需要的是一个MySql语句,对于给定的路由,它会告诉我两个端点的Point.Name。我可以写4个单独的陈述,但我相信有更好的方法。

这些表包含类似的列{rowiduseridlatitudelongitude}以使事情变得有趣:

  

Route.Name ='2011-06-27';

  

Point.Name ='location_1';

获得第一个和最后一个点很容易。 (在最后一点DESC之前添加LIMIT

SELECT `rowid`, `latitude`, `longitude` FROM `$db`.`Route` 
 WHERE `userid` LIKE '$userid' AND `name` = '$name' ORDER BY `rowid`  LIMIT 1;

我一直在阅读关于OUTER JOIN的内容,并认为这样可行,这就像我一样接近。

SELECT DISTINCT a.`rowid`, a.`latitude`, a.`longitude`, b.`name` 
 FROM `$db`.`Route` a
 RIGHT OUTER JOIN `$db`.`Point` b ON a.`latitude` = b.`latitude`
 AND a.`longitude` = b.`longitude` WHERE a.`userid` LIKE '$userid'
 AND a.`name` = '$name';

期望的输出:

  

rowid |纬度|经度|名称

     

'16660','49 .22551',' - 122.57416','location_5'

     

'16792','49 .16722109',' - 122.98667883','location_1'

实际输出:

  

rowid |纬度|经度|名称

     

'16791','49 .16721654',' - 122.98723093','location_1'

     

'16792','49 .16722109',' - 122.98667883','location_1'

我将非常感谢帮助我解决这个问题的任何帮助。 如果需要进一步的细节,请告诉我。

==== 编辑 ====

SELECT `name`, `latitude`, `longitude` FROM `$db`.`Point`
 WHERE (`latitude`,`longitude`) IN(
 SELECT `rowid`, `latitude`, `longitude` FROM 
 ( SELECT `rowid`, `latitude`, `longitude` FROM `$db`.`Route` 
 WHERE `userid` LIKE '$userid' AND `name` = '$name' ORDER BY `rowid`  LIMIT 1) as t1
UNION
 ( SELECT `rowid`, `latitude`, `longitude` FROM `$db`.`Route` 
 WHERE `userid` LIKE '$userid' AND `name` = '$name' ORDER BY `rowid` DESC LIMIT 1) )

这会产生Error Code: 1235 This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

因此,我需要更多地尝试使用LIMIT获取结果或检索结果,然后使用结果生成第二个查询。我稍后再回复你。再次感谢你。

2 个答案:

答案 0 :(得分:0)

您可以使用UNION来组合这两个SQL。

SELECT `rowid`, `latitude`, `longitude` FROM 

( SELECT `rowid`, `latitude`, `longitude` FROM `$db`.`Route` 
 WHERE `userid` LIKE '$userid' AND `name` = '$name' ORDER BY `rowid`  LIMIT 1) AS t0
UNION
( SELECT `rowid`, `latitude`, `longitude` FROM `$db`.`Route` 
 WHERE `userid` LIKE '$userid' AND `name` = '$name' ORDER BY `rowid` DESC LIMIT 1) AS t1

答案 1 :(得分:0)

我故障并将语句分成一个以收集端点,然后我将循环结果以查询名称。我真的希望一次性获得所有结果,以减少处理大量用户的流量= \

SELECT TRUNCATE(`latitude`,3) AS latitude, TRUNCATE(`longitude`,3) AS longitude 
 FROM `$db`.`$table1`
 WHERE `rowid` = (
  SELECT MIN(`rowid`) 
  FROM `$db`.`$table1`
  WHERE `userid` LIKE '$userid' AND `name` = '$name') 
UNION
 SELECT TRUNCATE(`latitude`,4) AS latitude, TRUNCATE(`longitude`,3) AS longitude
 FROM `$db`.`$table1`
 WHERE `rowid` = (
  SELECT MAX(`rowid`) 
  FROM `$db`.`$table1`
  WHERE `userid` LIKE '$userid' AND `name` = '$name')

使用此语句循环上一个查询的结果,以获得显示结束点的点。

SELECT name, latitude, longitude FROM `$db`.`$table2`
WHERE TRUNCATE(latitude,3) ='$lat' AND TRUNCATE(longitude,3) ='$lng' LIMIT 1;