假设我有一张表,其中一列是标题标签,其数据以逗号分隔。
"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%,')
但我不确定这是否是最佳方法。
你会怎么做?
答案 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涵盖逗号分隔列表的反模式。