【问题标题】:Find similar records by tags按标签查找相似记录
【发布时间】:2016-03-30 12:15:31
【问题描述】:

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

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

标签无论如何都不是按字母顺序排列的。

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

也许拆分表会更好?

【问题讨论】:

  • 选择第一条记录的标准是什么?更好地发布示例输入输出。
  • 请发布您遇到特定问题的代码。我们不能为你做作业。

标签: php mysql


【解决方案1】:

这可以通过使用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

【讨论】:

    猜你喜欢
    • 2013-08-03
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    相关资源
    最近更新 更多