说我有这个:
page_url | canvas_url
---------------------------------------------------------------
http://www.google.com/ | http://www.google.com/barfoobaz
http://www.google.com/foo/bar | http://www.google.com/foo
我想找到按最长匹配排序的字符串开头的行。我面临的问题是找到最长的匹配字符串,而不仅仅是匹配的行也有匹配的行。IE
http://www.google.com/foo匹配page_url
第 1 行和canvas_url
第 2 行,但如果它是两列的长度而不是匹配,它会认为第 1 行是更好的匹配,因为canvas_url
第 1 行更长。
我可以抓取所有匹配项,然后在代码中过滤长度,如下所示:
SELECT *, LENGTH(canvas_url), LENGTH(page_url)
FROM app
WHERE
'http://www.google.com/foo' LIKE CONCAT(canvas_url, '%') OR
'http://www.google.com/foo' LIKE CONCAT(page_url, '%')
canvas_url
或者执行 2 个子选择来获取各自的顶部匹配项page_url
,然后在代码中将其过滤为 1,但我更愿意(除非有任何荒谬的性能问题)让数据库只返回我需要的内容。
我最关心的是 MySQL,但我需要以 SQLite 和 Postgress 为目标,所以我对其中任何一个的答案都很满意。
建议?