繁体   English   中英

MySQL UNION SELECT直到找到?

[英]MySQL UNION SELECT until found?

假设我有一个带有'URL'列的表,我就像这样存储url

  • 一二

  • 一二三

  • 的α/ω-

我想从数据库中获取特定网址的数据,如果找不到,我会删除网址的最后一部分并再次搜索:

例:

我的网址像一个/两个/三个/四个/五个。

我搜索“一/二/三/四/五”

如果没有找到再次搜索“一/二/三/四”

如果没有找到再次搜索“一/二/三”

如果没有找到再次搜索“一/二”

我希望有类似的东西:

SELECT * FROM db WHERE url=one/two/three/four/five

UNION

SELECT * FROM db WHERE url=one/two/three/four/five

UNION

SELECT * FROM db WHERE url=one/two/three/four

UNION

SELECT * FROM db WHERE url=one/two/three

UNION

SELECT * FROM db WHERE url=one/two

UNION

SELECT * FROM db WHERE url=one

但是我想停止搜索是否找到了行。

这是可能的,还是必须使用分开的查询来完成。

感谢帮助。

只需用UNION ALL替换UNION ,最后添加LIMIT 1

PS UNION ALL在这个特定的例子中没有太大的区别,但知道它们的区别很有用: http//www.mysqlperformanceblog.com/2007/10/05/union-vs-union-all-performance/

我觉得这是你问题最优雅的方法。 此语句是独立的深度路径,您不需要在后续选择中拆分常量URL:

SELECT 
   * 
FROM 
   db 
WHERE 
   concat( 'one/two/three/four/five' , '/') like concat( url , '/%')
ORDER BY
   LENGTH (url) desc
LIMIT 1

我在MySQL中测试了这个查询, 你也可以检查一下! (在MSSQL语法中)

Let's say I have table with column 'URL' whrere I store urls like this

one/two

one/two/three

alpha/omega

不要这样做,这是一个可怕的设计,证明是你运行这么简单的查询的问题; 将每个URl存储在不同的行上。 阅读规范化。

您可以使用正则表达式在单个查询中进行搜索,但它会为您提供所有行:

SELECT * FROM db WHERE url REGEXP "^one((/two)|(/two/three)|(two/three/four)|(/two/three/four/five))?$"

因此,如果您只想要第一个WHERE的结果,则必须进行多个查询。 如果你真的想要一个查询而不关心搜索中的一点开销,你可以做

SELECT * FROM db WHERE url REGEXP "^one((/two)|(/two/three)|(two/three/four)|(/two/three/four/five))?$" ORDER BY length(url) DESC LIMIT 1

这将只为您提供第一个可能的结果,但内部查询必须首先获得所有可能的结果 - >效率较低,但更紧凑。

我希望这有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM