return 相似标记网址列表 mysql

return list of similar tagged urls mysql

urls table

url date
http://url1 a
http://url2 b
http://url3 c
http://url4 d

标签table

url tags
http://url1 x
http://url1 y
http://url2 x
http://url2 y
http://url3 x
http://url3 z
http://url4 z

url table 有 url 数据和标签 table 有 url 标签数据。

我想要 url 具有按相似标签的数量排序的相似标签

eg1: 如果我想要 URLs 具有与 URL 'http://url1' 相似的标签 查询应该 return

url similar tags
http://url2 x,y
http://url3 x

'http://url1' 有 x,y

'http://url2' 与 'http://url1'

有相同的 x,y

'http://url3' 与 'http://url1'

有相同的 x

eg2: 'http://url4'

url similar tags
http://url3 z

'http://url3' 与 'http://url4'

有相同的 z

所以 urls 应该 return 按相似标签计数排序 (desc)

注意:对于指定的 url,查询应该只 return 类似 url,如 eg1 'http://url1'

我不擅长较大的 sql 查询,所以我需要问这个。

提前致谢

SELECT
    urls.url,
    GROUP_CONCAT(t1.tags) as "similar tags"
FROM urls
INNER JOIN tags t1 ON t1.url=urls.url
INNER JOIN tags t2 ON t2.url='http://url1' and t2.tags = t1.tags
GROUP BY urls.url

您可以选择添加一个 WHERE urls.url <> 'http://url1'(在 GROUP BY 之前和最后一个 INNER JOIN 之后)

参见:DBFIDDLE

编辑:从 table tags 开始,如@Andrea_86 建议,也有效:

SELECT 
   t1.url, 
   GROUP_CONCAT(t1.tags) as "similar tags" 
FROM tags t1 
INNER JOIN tags t2 ON t2.url='http://url1' and t2.tags = t1.tags 
GROUP BY t1.url