Mysql 子句到联接之间的转换

Mysql 子句到联接之间的转换,mysql,sql,oracle,db2,postgresql-9.1,Mysql,Sql,Oracle,Db2,Postgresql 9.1,对于可以在mysql、postgres和其他主要数据库上运行的联接,需要一个通用sql查询 我有一个名为autumn4.ip的表,我有三列:id、start、end(所有int)。 如何创建联接,以便使用联接,而不是中间联接,而是通过联接 像伪: select * FROM autumn.ip WHERE :number-constant >= start ORDER BY start DESC LIMIT 1; + select * FROM autumn.ip WHERE :numb

对于可以在mysql、postgres和其他主要数据库上运行的联接,需要一个通用sql查询

我有一个名为autumn4.ip的表,我有
三列:id、start、end(所有int)。

如何创建联接,以便使用联接,而不是中间联接,而是通过联接

像伪:

select * FROM autumn.ip WHERE :number-constant >= start ORDER BY start DESC LIMIT 1; +

select * FROM autumn.ip WHERE :number-constant <= end ORDER BY start ASC LIMIT 1;
只是不要问我为什么这么做:) 但我知道你会这么说:

我试图完成的是使用两个索引,开始和结束。如果我使用BETHEN和/或start、end的复合索引。只使用开始索引,不使用结束索引。现在请不要告诉我我错了。我只想这样。我对此做了很多研究


如果我为开始和结束创建了单个索引,那么只会使用一个索引。给我一个查询,其中两个都使用了

您希望请求使用联接只选择开始和结束之间的第一行吗

编辑:

忘了我的答案吧!我想的不需要两张桌子!这更像是一个索引问题,而不是其他任何问题

您可以尝试在开始处放置一个索引,在结束处放置另一个索引(似乎两列都有一个索引,不是吗?),然后按如下方式进行选择:

SELECT * FROM autumn4.ip WHERE :number >= START AND :number <= END ORDER BY START LIMIT 1; 

(or ORDER BY START DESC if you want the biggest start) .

SELECT*FROM autumn4.ip其中:number>=START和:number您在MySQL中听到的范围扫描和
between
根本不正确。以下是一段引用自:

B-树索引特征

B树索引可用于以下表达式中的列比较:
使用=,>,>=,那么你的问题是什么?你不应该在秋4.ip.number上有索引吗?或者这只是一个常量,这个查询还有更多内容?@user1336827我的假设是“为什么这个查询需要30秒,我可以做些什么来优化它?”尽管我认为这里的问题和查询还有更多内容。粗体显示,我需要一个基于连接的查询。数字是一个数字,而不是列名如果没有
限制1
,会有多少个结果?有多慢?应该针对索引等优化中间。联合会将更慢(并且有2个结果,而不是1个)。有些结果对我不起作用。下面是一个示例数据,适用于您的模型:小心:您应该在列上添加主键。。。在这里,我认为“loc_id”字段在示例中是唯一的。如果你答应多给我一点指导。选择数字>=开始将产生许多值,我获取最大值如何。然后选择数字,请添加一些信息:您到底想要哪一行?按订单也可以。因为number>start可以有许多行,而numberjoin
查询(可能存在一些奇怪的情况,
join
版本会更好);我怀疑这是出于对SQL的无知。我理解,这也是为什么我的第一个回复(现在编辑)包含与您相同的连接。。。但如果我们能改变他的想法,或者帮助他解释为什么他绝对想加入,那就太好了。不,问题悬在db面前。替换为gt.PRIMARYKEY=lt.PRIMARYKEY;按gt.id=lt.id;
SELECT * FROM autumn4.ip WHERE :number >= START AND :number <= END ORDER BY START LIMIT 1; 

(or ORDER BY START DESC if you want the biggest start) .
select gt.*
from (SELECT * FROM autumn4.ip WHERE :number >= start) gt join 
     (SELECT * FROM autumn4.ip WHERE :number <= end) lt
     on gt.PRIMARYKEY = lt.PRIMARYKEY;