我使用分隔符(例如“1,5,10”)和TEXT数据类型在MySQL单元格中存储多个数字。
如何执行这样的查找?
SELECT * FROM MyTable WHERE MultiVals CONTAINS "5"
最后,这是存储此类值的首选方法吗?我正在使用它像链接器表,将某些行链接到另一个表中的多个其他行(通过ID)。由于我正在尝试最小化数据库的文件大小,我认为这将是一种更紧凑的链接方法,而不是像这样使用另一个表:
Person ID Product ID
----------- -----------
3 1
3 2
3 3
7 5
7 7
答案 0 :(得分:3)
建议在两个链接表之间用两个外键ID列创建第三个所谓的映射表。
Project ID Tag ID
----------- -----------
3 1
3 2
3 3
7 5
7 7
使用这些,两个外键也充当索引。因此,与FIND_IN_SET
方法相比,它将大大加快查找速度。
您正在最小化文件大小,因为TEXT
数据类型为未使用的位保留空格,而数值存储是最佳的,并使用最小的本地存储。
无论如何,如果你想保持原来的方式,你可以这样做:
SELECT * FROM MyTable WHERE FIND_IN_SET(5,MultiVals) >0
这将确保使用逗号匹配值,因此值5将仅匹配“5”而不是“15”
答案 1 :(得分:2)
你不应该这样做。您应该创建一个链接到myTable的表,并在行中保存值。你应该这样做的原因太多了,但我个人最喜欢的是 - 考虑投资未来。
使用分隔数据,由于负载增加或数据量大,您迟早会遇到问题。
MySql和任何其他关系数据库一样,在搜索int等时比在字符串中搜索更快。更不用说字符串索引需要花费更多的dn资源来维护它们。
所有人都说,如果你不打算做任何严肃的sutff(至少在MyTable中有数百万条记录或在一个MultiVal字段中超过50个值),你可以继续做你现在一直在做的事情。 - 你不会看到任何性能提升。
答案 2 :(得分:1)
尽可能避免这种情况,因为它违反了数据库规范化的规则,并且很难对这些值进行索引。您的值可以保存在单独的查找表或类似内容中。
如果您别无选择,只能使用此设计,那么您可以查询以下值:
select * from mytable where concat(',', multivals, ',') like '%,5,%'
除了微不足道的数据之外,很可能会破坏性能,或编写一个拆分行的函数(基于你的分隔符“,”)并检查生成的数组,或者使用全文索引。
编辑:find_in_set
运算符比使用like
更优雅,但我不知道它是如何在封面下实现的。
答案 3 :(得分:0)
.. where field RLIKE '(^|,)5($|,)'