【问题标题】:SQL Query meeting condition on longitude AND latitudeSQL查询经度和纬度满足条件
【发布时间】:2017-04-27 18:56:58
【问题描述】:

我正在使用 mySQL,我的表的列如下:

post_id,meta_id,meta_value,meta_key

虚拟数据附加为:

我希望数据满足纬度必须在 60 到 60.5 之间的条件 经度必须在 8 到 9 之间。

我正在使用以下 where 子句:

SELECT * 
FROM domenposts 
LEFT JOIN domenpostmeta ON domenposts.id=domenpostmeta.post_id 
WHERE ( domenpostmeta.meta_key = 'longitude' AND domenpostmeta.meta_value BETWEEN 8  AND 9 )
OR    ( domenpostmeta.meta_key = 'latitude'  AND domenpostmeta.meta_value BETWEEN 60 AND 60.5 ) 

这是有效的,但根据我的逻辑,条件之间必须是 AND 而不是 OR,这会导致零行。 我需要帮助来解决这个问题。

需要输出: 纬度在 60 到 60.4 之间且经度在 8 到 9 之间的所有 post_id。

这是我的表格数据:

postid  metaid  meta_key  meta_value
1109    109 longitude   8.2135
1108    109 latitude    60.4029
1002    239 longitude   9
1080    241 latitude    70
1051    5   latitude    60
1001    239 latitude    62

【问题讨论】:

  • 嗨!请您edit您的问题(不要尝试将详细信息发布为 cmets,它们不会正确格式化)包括:您正在使用的 DBMS(MySQL、MS SQL Server、PostgreSQL 等);问题中作为文本而不是图像的一小部分虚拟数据样本;您正在运行的完整 SQL,而不仅仅是 WHERE 子句;你想要的输出,以及你得到的输出。
  • 请阅读meta.stackoverflow.com/questions/285551/… 和接受的答案
  • 更新问题
  • @FaizanZahid 我仍然看不到您正在使用的数据库类型、文本形式的虚拟数据或预期和实际输出的实际示例。这对您来说似乎很明显,但请记住,我们并没有越过您的视线,我们只知道您提供给我们的信息,因此您必须帮助我们为您提供帮助。
  • 请阅读minimal reproducible example并采取行动。

标签: sql database self-join


【解决方案1】:

or 条件只是充当联合语句。因此,如果您使用以下查询

select * from domenposts where (meta_key='lattitude' and meta_value Between 60 and 64) 
union 
select * from domenposts where (meta_key='longitude' and meta_value Between 8 and 9) 

这相当于你写的有效的陈述

SELECT * FROM domenposts 
LEFT JOIN domenpostmeta ON domenposts.id=domenpostmeta.post_id 
WHERE (domenpostmeta.meta_key = 'longitude' AND domenpostmeta.meta_value BETWEEN  8  AND 9 ) OR    (  domenpostmeta.meta_key = 'latitude'  AND domenpostmeta.meta_value BETWEEN  60  AND 60.5  )

【讨论】:

  • 我想要的实际查询是 SELECT * FROM domenposts LEFT JOIN domenpostmeta ON domenposts.id=domenpostmeta.post_id WHERE (domenpostmeta.meta_key = 'longitude' AND domenpostmeta.meta_value BETWEEN 8 AND 9 ) AND ( domenpostmeta.meta_key = '纬度' AND domenpostmeta.meta_value BETWEEN 60 AND 60.5 )
  • “工作”的查询不是他们想要的查询。 “工作”查询“有效”,因为它返回了他们对使用 OR 想到的规范的期望,但是在查询中用 AND 替换 OR 并没有给他们想要的查询,这是对规范的查询他们考虑使用 AND。
  • 并且此查询返回零行,这不是所需的结果。我想要所有纬度在 60 到 64 之间,经度在 8 到 9 之间的 post_id。or 条件返回一些纬度和经度超出所需范围的 post_id
  • @FaizanZahid 再次,请编辑澄清您的问题。此外,您“实际上想要”评论中的查询,您知道这是错误的,因为它不返回任何行。如果您编写了一个非常清晰的语句,根据列加上您的输入表和/或它们保存的行来描述您想要的行,这将很有帮助。请努力写清楚。重新查询版本见this
  • 可视化工作请访问 boligbilder.no 并搜索“moholt”。 moholt 的公司应该只出现,但 oslo 的公司也会出现,因为 moholt 和 oslo 的经度差异很小。
【解决方案2】:
SELECT * FROM domenposts 
LEFT JOIN domenpostmeta p1 ON domenposts.id=p1.post_id 
LEFT JOIN domenpostmeta p2 ON p1.post_id = p2.post_id 
WHERE (p1.meta_key = 'longitude' AND p1.meta_value BETWEEN  8  AND 9 ) OR    (  p2.meta_key = 'latitude'  AND p2.meta_value BETWEEN  60  AND 60.5  )

这是我为解决我的问题而实施的解决方案

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-24
    • 2013-12-29
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    相关资源
    最近更新 更多