MySQL查询中如何改写URL以实现HTTP/HTTPS的LIKE关联?
解决HTTP/HTTPS URL关联匹配问题
这个场景太常见了——不同协议的URL导致关联逻辑失效,其实我们可以通过统一URL协议格式或者直接忽略协议部分来搞定,下面给你两种实用方案:
方案一:将sites.url统一转为HTTP格式
直接把sites.url里的https://替换成http://,不管原URL是HTTP还是HTTPS,都会统一成HTTP协议再去匹配sites_links.naar。修改后的完整查询如下:
SELECT *, sites.id AS id, sites.url AS url, COUNT(sites_links.id) AS netwerklinks FROM sites LEFT JOIN data ON sites.id = data.id LEFT JOIN sites_links ON sites_links.naar LIKE CONCAT('%', REPLACE(sites.url, 'https://', 'http://'), '%') WHERE sites.url IS NOT NULL GROUP BY sites.id;
这个方法的优势是改动极小、逻辑直观,而且REPLACE函数几乎所有SQL数据库都支持,兼容性拉满。如果原URL本身就是HTTP协议,REPLACE会因为找不到https://而直接返回原URL,完全不影响结果。
方案二:忽略协议部分进行匹配
如果未来可能出现其他协议(比如ftp://),可以直接去掉所有开头的协议部分,只匹配域名和路径。用支持正则替换的函数(比如MySQL 8+、PostgreSQL、SQL Server 2017+的REGEXP_REPLACE)来实现:
SELECT *, sites.id AS id, sites.url AS url, COUNT(sites_links.id) AS netwerklinks FROM sites LEFT JOIN data ON sites.id = data.id LEFT JOIN sites_links ON sites_links.naar LIKE CONCAT('%', REGEXP_REPLACE(sites.url, '^https?://', ''), '%') WHERE sites.url IS NOT NULL GROUP BY sites.id;
这里^https?://会精准匹配开头的http://或https://,替换为空后两边都只保留域名及后续内容,自然就能匹配上了。
兼容老版本数据库的替代写法
如果你的数据库不支持正则替换,也可以用嵌套REPLACE实现同样效果:
REPLACE(REPLACE(sites.url, 'https://', ''), 'http://', '')
内容的提问来源于stack exchange,提问作者Silver
相关产品推荐
相关产品推荐

