过去几天我一直在努力寻找答案。 我有一张GPS数据路径表。和一个表。我需要的是一个MySql语句,对于给定的路由,它会告诉我两个端点的Point.Name。我可以写4个单独的陈述,但我相信有更好的方法。
这些表包含类似的列{rowid
,userid
,latitude
,longitude
}以使事情变得有趣:
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获取结果或检索结果,然后使用结果生成第二个查询。我稍后再回复你。再次感谢你。
答案 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;