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

Posted

技术标签:

【中文标题】MySQL 查询从表中检索数据和第二个查询以提取其他结果,没有重复【英文标题】:MySQL query to retrieve data from table and a 2nd query to pull other results, without duplicates 【发布时间】:2012-09-25 15:39:52 【问题描述】:

我已经在这方面四处寻找了一段时间,但没有什么能真正满足我的需要。

我正在搜索一个包含经度和纬度值条目的表。这将返回一组结果。还有一些条目没有 long/lat 值,我需要根据一些日期值返回。

我知道这两者通常不会产生重复的结果,但我仍然有兴趣知道如何进行这种查询。

第一季度:

"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但匹配日期范围的条目:

第二季度:

"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 !in(ids,from,q1)"

到第二次查询,然后用php合并两个结果,mysql一定有一些巧妙的方法来做到这一点;所以问题是这样的:

我怎样才能在一个查询中做到这一点,并忽略第一季度已经找到的任何 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)

有什么想法吗?

【问题讨论】:

这么长的代码行你应该把它分成几行,除非你希望有人分析你的三个或更多屏幕宽的例子:) PS。而且你不需要用“”引用代码来格式化它,如果需要的话,在代码中使用它.. 【参考方案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,您可以从两个集合中检索结果,而不会重复。

【讨论】:

是的,这解决了我的直接问题,但问题实际上是关于在查询的第二部分添加 ids!in 子句 dev.mysql.com/doc/refman/5.0/en/union.html "UNION 的默认行为是从结果中删除重复行。" 该死的......似乎有一个问题“HAVING distance

以上是关于MySQL 查询从表中检索数据和第二个查询以提取其他结果,没有重复的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 查询临时表以从表中检索 2 行

MySQL查询从表中提取两条信息

如何从表中获取所有数据,包括表 ID

PDO 从表中提取一列到一维数组中

从表中提取字符串以在查询中使用

Oracle Join 表与第一个表中的日期范围和第二个表中的日期