在我的数据库中,每个用户都可以拥有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个标签等
有一种简单的方法吗? 谢谢!
答案 0 :(得分: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将数字上下文中的布尔值视为1表示true,0表示false。
注意:如果您希望用户输入允许正则表达式模式匹配,则可以使用regexp
执行相同的操作。
答案 1 :(得分:0)
你可以试试这个:
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-'
但使用正则表达式是一个坏主意