在我的数据库中,每个用户都可以具有5个标签,该标签是1到37。
例如,如果用户只有一个标签,则数据库显示:
tag1 : 36
tag2 : 0
tag3 : 0
tag4 : 0
tag5 : 0
在"搜索用户"页面上,您可以从1到5个标签中进行选择(输入名称为Skill1至Skill5),并且该页面必须相应地显示配置文件。
目前,如果您只选择一个标签,则可以使用此请求:
WHERE tag1 REGEXP '$skill1|$skill2|$skill3|$skill4|$skill5'
,但我不知道如何使其适用于1至5个标签。
我的目标是有一个似乎:
的请求WHERE (tag1 or tag2 or tag3 or tag4 or tag5) REGEXP '$skill1|$skill2|$skill3|$skill4|$skill5'
,是否有办法衡量结果?例如,首先,用户有4个搜索标签,然后有3个标签等。
有一种简单的方法吗?
您的数据结构差。您应该有一个每个实体和每个标签的交界表。
您可以做自己想做的事:
where tag1 in ($skill1, $skill2, $skill3, $skill4, $skill5) or
tag2 in ($skill1, $skill2, $skill3, $skill4, $skill5) or
tag3 in ($skill1, $skill2, $skill3, $skill4, $skill5) or
tag4 in ($skill1, $skill2, $skill3, $skill4, $skill5) or
tag5 in ($skill1, $skill2, $skill3, $skill4, $skill5)
order by ( (tag1 in ($skill1, $skill2, $skill3, $skill4, $skill5)) +
(tag2 in ($skill1, $skill2, $skill3, $skill4, $skill5)) +
(tag3 in ($skill1, $skill2, $skill3, $skill4, $skill5)) +
(tag4 in ($skill1, $skill2, $skill3, $skill4, $skill5)) +
(tag5 in ($skill1, $skill2, $skill3, $skill4, $skill5))
) desc
mysql在数字上下文中将布尔值视为true的值1,为false的值为0。
注意:如果您希望用户输入允许正则表达式模式匹配,则可以使用regexp
进行相同的操作。
您可以尝试以下方法:
select *
from
(select username, concat_ws('-',tag1,tag2,tag3,tag4,tag5,'') as tags
from table
where username = 'nik'
and (tag1 > 0 OR tag2 > 0 OR tag3 > 0 OR tag4 > 0 OR tag5 > 0)
order by tag1,tag2,tag3,tag4,tag5) conc
where conc.tags REGEXP '$skill1-|$skill2-|$skill3-|$skill4-|$skill5-'
但是使用regexp是一个坏主意