我已经在这方面四处寻找了一段时间,但没有什么能真正满足我的需要。
我正在搜索一个包含经度和纬度值条目的表。这将返回一组结果。还有一些条目没有 long/lat 值,我需要根据某些日期值返回它们。
我知道这两者通常不会产生重复的结果,但我仍然有兴趣知道如何进行这种查询。
Q1:
"SELECT id, from_date, to_date, event_title, event_longitude, event_latitude,
(SQRT( POW( 69.1 * ( event_latitude - 51.4999501637 ) , 2 ) +
POW( 69.1 * ( -0.195226 - event_longitude ) * COS( event_latitude / 57.3 ) , 2 ) )
* 1609.344) AS distance, (SQRT( POW( 69.1 * ( event_latitude - 51.4999501637 ) , 2 )
+ POW( 69.1 * ( -0.195226 - event_longitude ) * COS( event_latitude / 57.3 ) , 2 ) )
* 1609.344) AS true_distance FROM table1 WHERE id!=0 AND no_place='0'
AND from_date >= '45645646' AND to_date <= '76647446' HAVING distance <= '5000'
ORDER BY distance ASC LIMIT 50"
这将返回匹配长/纬度范围的条目,并忽略任何标记为 no_place=0 的条目。这使用 Haversine 进行长/纬度计算。
第二个查询需要提取没有 long/lat 但与日期范围匹配的条目:
Q2:
"SELECT id, from_date, to_date, event_title, event_longitude, event_latitude FROM
table1 WHERE no_place='1' AND from_date >= '45645646' AND to_date <= '76647446'
LIMIT 50"
我可以在这里运行两个单独的查询,并附加“WHERE ids !in(ids,from,q1)”
到第二个查询,然后使用PHP合并两个结果,MySQL必须有一些狡猾的方法来做到这一点;所以问题是这样的:
如何仅在一个查询中执行此操作,并忽略 Q1 中已找到的任何 ID。我知道我有 no_place 列,在这种情况下将保证我没有重复的行,但假设我没有此列,我将如何添加
"WHERE ids !in(ids,from,q1)"
条款?另外我想我可能需要先用 no_place=1 条目排序这个总结果,然后再按距离值排序 no_place=0 条目。
呸!
在“希望我有帮助”的精彩回答后更新
所以这似乎可行,但它会丢失结果中的距离值:
(SELECT id, from_date, to_date, event_title, event_longitude, event_latitude,
(SQRT( POW( 69.1 * ( event_latitude - 51.4999501637 ) , 2 ) + POW( 69.1 *
( -0.195226 - event_longitude ) * COS( event_latitude / 57.3 ) , 2 ) ) * 1609.344)
AS distance, (SQRT( POW( 69.1 * ( event_latitude - 51.4999501637 ) , 2 ) + POW( 69.1
* ( -0.195226 - event_longitude ) * COS( event_latitude / 57.3 ) , 2 ) ) * 1609.344)
AS true_distance FROM table1 WHERE id!=0 AND no_place='0'
HAVING distance <= '5000' ORDER BY distance ASC LIMIT 50) UNION(SELECT id, from_date,
to_date, event_title, event_longitude, event_latitude, 0, 0 FROM table1 WHERE
no_place='1' LIMIT 50)
这有效,但我现在在查询中没有半径限制......
(SELECT id, from_date, to_date, event_title, event_longitude, event_latitude,
(SQRT( POW( 69.1 * ( event_latitude - 51.4999501637 ) , 2 ) +
POW( 69.1 * ( -0.195226 - event_longitude ) * COS( event_latitude / 57.3 ) , 2 ) )
* 1609.344) AS distance, (SQRT( POW( 69.1 * ( event_latitude - 51.4999501637 ) , 2 )
+ POW( 69.1 * ( -0.195226 - event_longitude ) * COS( event_latitude / 57.3 ) , 2 ) )
* 1609.344) AS true_distance FROM table1 WHERE id!=0 AND no_place='0' ORDER BY
distance ASC LIMIT 50) UNION(SELECT id, from_date, to_date, event_title,
event_longitude, event_latitude, 0, 0 FROM table1 WHERE no_place='1' LIMIT 50)
有任何想法吗?