[英]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.