我有一个MySQL
表,其中一个'name'
字段和7个标记文本字段(tag1, tag2, ...)
。
并非所有7个标记字段都需要填充,有些记录只有3个或4个标记。
标签不是按字母顺序排列的。
我需要选择一个记录,然后列出其他10个具有相似标签的记录。具有相同7个标签的记录(如果有的话)应该出现在具有6个相似标签的记录之前,依此类推。
分开桌子可能会更好吗?
答案 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
。