需要帮助才能找到多个标记名的位置

时间:2014-05-09 07:08:30

标签: mysql sql

  • 我有一个名为区域的表格,我添加了带有标记字段的区域,即“旅游,夜生活,西区,餐饮”等等。
  • 现在我有一些记录,如下

Area | TagNames ------ ------------- New York Tourist, NightLife Switzerland Tourist, Dining London NightLife, West Ends, Tourist . . . . . . . . 我在桌子上有这样一个字段,现在我的问题是,

我想找到标签名为“Tourist”和“NightLife”的区域,任何人都可以告诉我它的查询。 我知道FIND_IN_SET可以工作,但它可以用于找到一条记录。 示例FIND_IN_SET("Tourist", TagNames),但对于多个标记名,它将不起作用。请求告诉我如何解决这个问题?

1 个答案:

答案 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

Database Normalization

对于上面的结构,我会说你需要有一个标签表,它将所有标签和其他表存储为连接表,或者将其称为关联表,它将为每个区域再次存储多个标签而不是单行

表格结构

区域表

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上的附加添加索引,你很高兴