在mysql表中搜索标签的更好方法

时间:2016-08-31 01:48:01

标签: mysql tags

假设我有一张表,其中一列是标题标签,其数据以逗号分隔。

"tag1,tag2,new york,tag4"

如您所见,某些标签会有空格。

对于任何等于"纽约"

的标签,查询表格的最佳或最准确方法是什么?

过去我曾用过:

SELECT id WHERE find_in_set('new york',tags) <> 0 

但是当值有空格时,find_in_set不起作用。

我目前正在使用这个:

SELECT id WHERE concat(',',tags,',') LIKE concat(',%new york%,') 

但我不确定这是否是最佳方法。

你会怎么做?

2 个答案:

答案 0 :(得分:3)

当项目A可以与项目B的许多项目相关联时,项目B可以与项目A的许多项目相关联。这称为Many to many relationship

具有这些关系的数据应存储在单独的表中,并仅在查询时连接在一起。

Examble

表1

| product_uid | price | amount |
|      1      | 12000 |  3000  |
|      2      | 30000 |   600  |

表2

| tag_uid | tag_value |
|    1    |   tag_01  |
|    2    |   tag_02  |
|    3    |   tag_03  |
|    4    |   tag_04  |

然后我们使用连接表来关联它们

表3

| entry_uid | product_uid | tag_uid |
|    1      |     1       |     3   |
|    2      |     1       |     4   |
|    3      |     2       |     1   |
|    4      |     2       |     2   |
|    5      |     4       |     2   |

查询将是(如果您想选择第一项和标签)

SELECT t1.*, t2.tag_value 
FROM Table1 as t1,
JOIN Table3 as join_table ON t1.product_uid = join_table.product_uid
JOIN Table2 as t2 ON t2.tag_uid = join_table.tag_uid
WHERE t1.product_uid = 1

答案 1 :(得分:1)

如果我需要忽略tags中逗号之前和之后的前导空格。

例如,如果tags的值为:

'atlanta,boston , chicago, los angeles  , new york '

并假设空格是我想要忽略的唯一字符,而我正在搜索的标签没有任何前导或尾随空格,那么我可能会使用正则表达式。像这样:

SELECT ...
  FROM t
 WHERE t.tags REGEXP CONCAT('^|, *', 'new york' ,' *,|$')

我推荐Bill Karwin的优秀书籍“SQL Antipatterns:避免数据库编程的陷阱”

https://www.amazon.com/SQL-Antipatterns-Programming-Pragmatic-Programmers/dp/1934356557

第2章Jaywalking涵盖逗号分隔列表的反模式。