MySQL查询从表中检索数据和第二个查询以获取其他结果,没有重复

时间:2012-09-25 15:39:52

标签: php mysql database haversine

我现在已经在这里狩猎了一段时间了,但是没有任何东西真正出现,正是我所需要的。

我正在搜索包含经度和纬度值条目的表格。这将返回一组结果。还有一些条目没有我需要根据某些日期值返回的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"

这将返回与long / lat范围匹配的条目,并忽略标记为no_place = 0的任何条目。这使用Haversine来进行长/ lat计算。

第二个查询需要提取没有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"

我可以在这里运行两个单独的查询,然后追加     “在哪里!(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)

任何想法?

1 个答案:

答案 0 :(得分:1)

尝试:

(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)
        UNION
    (SELECT id, from_date, to_date, event_title, event_longitude, event_latitude,
    0, 0
    FROM table1
    WHERE no_place='1' AND from_date >= '45645646' AND to_date <= '76647446'
    LIMIT 50)

通过应用UNION,您可以从两个集合中检索结果,而无需重复。