Area | TagNames
------ -------------
New York Tourist, NightLife
Switzerland Tourist, Dining
London NightLife, West Ends, Tourist
. .
. .
. .
. .
我在桌子上有这样一个字段,现在我的问题是,
我想找到标签名为“Tourist”和“NightLife”的区域,任何人都可以告诉我它的查询。
我知道FIND_IN_SET可以工作,但它可以用于找到一条记录。
示例FIND_IN_SET("Tourist", TagNames)
,但对于多个标记名,它将不起作用。请求告诉我如何解决这个问题?
答案 0 :(得分:1)
如果有可能你可以改变你的架构然后在第一优先级上将其标准化,我会做的第一件事。要回答你的问题,你需要使用FIND_IN_SET()
多次与你要比较的标签名称和运营商
SELECT * FROM `table`
WHERE FIND_IN_SET('Tourist', TagNames) >0
AND FIND_IN_SET('NightLife', TagNames) >0
and so on ... for multiple tags
对于上面的结构,我会说你需要有一个标签表,它将所有标签和其他表存储为连接表,或者将其称为关联表,它将为每个区域再次存储多个标签而不是单行
表格结构
区域表
ID name
1 xxx
标签表
ID name
1 xxx
2 yyy
区域标签
ID area_id tag_id
1 1 1
2 1 2
加入查询
SELECT a.*
FROM area a
JOIN area_tags at ON(a.ID=at.area_id)
JOIN tag t ON(t.ID=at.tag_id)
WHERE t.name IN('Tourist','NightLife')
GROUP BY a.ID
HAVING COUNT(DISTINCT at.tag_id) >=2 /* which contains these tags with other if you need only these the change it to HAVING COUNT(DISTINCT at.tag_id) =2 */
area_id,tag_id
上的附加添加索引,你很高兴