私がこれを持っていると言う:
page_url | canvas_url
---------------------------------------------------------------
http://www.google.com/ | http://www.google.com/barfoobaz
http://www.google.com/foo/bar | http://www.google.com/foo
最長の一致順に並べられた文字列の先頭である行を見つけたいのですが。私が直面している問題は、一致する行だけでなく、一致する行もある、最も長い一致する文字列を見つけることです。つまり
http://www.google.com/foopage_url
は行1と行2で一致しますcanvas_url
が、一致ではなく両方の列の長さである場合は、行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をターゲットにする必要があるので、どちらの答えでも満足しています。
提案?