按标签查找类似记录

时间:2016-03-30 03:52:18

标签: php mysql

我有一个MySQL表,其中一个'name'字段和7个标记文本字段(tag1, tag2, ...)

并非所有7个标记字段都需要填充,有些记录只有3个或4个标记。

标签不是按字母顺序排列的。

我需要选择一个记录,然后列出其他10个具有相似标签的记录。具有相同7个标签的记录(如果有的话)应该出现在具有6个相似标签的记录之前,依此类推。

分开桌子可能会更好吗?

1 个答案:

答案 0 :(得分:0)

这可以利用FIND_IN_SET来产生匹配的订单排名。

试试这个:

(select * from t1 where name = 'input_name')
union all
(select from t2.name, t2.tag1, t2.tag2, t2.tag3, t2.tag4, t2.tag5, t2.tag6, t2.tag7 
(
    select
        *,
        FIND_IN_SET(tag1, @tags) + FIND_IN_SET(tag2, @tags) + FIND_IN_SET(tag3, @tags) + FIND_IN_SET(tag4, @tags) +
        FIND_IN_SET(tag5, @tags) + FIND_IN_SET(tag6, @tags) + FIND_IN_SET(tag7, @tags) AS cnt_tags
    from t1 CROSS JOIN 
    (SELECT @tags := (select CONCAT_WS(',',tag1,tag2,tag3,tag4,tag5,tag6,tag7) 
                      from t1 where name = 'input_name')) param
) t2
where name != 'input_name'
order by cnt_tags desc 
limit 10)
  

要在真实桌面上使用,请将'input_name'替换为您的真实过滤器name