gpt4 book ai didi

mysql - 选择所有字段包含以逗号分隔的字符串

转载 作者:行者123 更新时间:2023-11-29 04:25:41 25 4
gpt4 key购买 nike

我有一个名为“标签”的字段,其中包含以逗号分隔的标签列表,例如:

ios, ios development, freelance, new_project

我想查询该字段以检查值“ios”是否在逗号分隔列表中。你能告诉我怎么做吗?

最佳答案

对于 MySQL,您可以使用 FIND_IN_SET():

SELECT * FROM mytable WHERE FIND_IN_SET('ios ', tags) > 0;

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set

请注意,FIND_IN_SET 要求字符串以逗号 分隔,而不是逗号和空格 分隔。所以你可能对最后一个标签有问题。真正最好的方法是规范化表格;否则,您可能会删除 tags 列中的空格;最后,您可以通过在 tags 列中添加一个空格来解决该问题:

SELECT * FROM mytable WHERE FIND_IN_SET('ios ', CONCAT(tags,' ')) > 0;

如果标签数量有限,您可以考虑将列转换为 SET。这将大大提高效率。

更新

只是我的空格错了。它们在字符串之前而不是之后。

所以:

SELECT * FROM mytable WHERE FIND_IN_SET(' ios', CONCAT(' ', tags)) > 0;

但是,再说一次,摆脱那些空间——它们只不过是麻烦:-)

更新 2

上面的工作,好的。但是,这几乎是你能说的所有对我有利的话。该解决方案不仅非常*低*效率,而且还使系统几乎无法维护(在那里,完成了,得到了 T 恤和下面的咀嚼屁股)。所以我现在要强调一下支持规范化,即至少再有这两个表:

CREATE TABLE tags ( id      INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
tagName varchar(32) // I'm a bit of a cheapskate
);
CREATE TABLE has_tag ( tableid INTEGER, tagid INTEGER );

这有多好?让我数一数。

  • 您可以轻松添加更灵活的查询(“具有 iOS、C++ 中的所有标签,...”或“至少具有以下三个标签:(iOS、Python、SQL、.NET、Haskell)”。是的,您可以使用 FIND_IN_SET 来完成此操作,但请相信我,您不会喜欢它
  • 您有一个受控的标签字典,它使您能够检查任何标签是否已知(以及轻松生成列表,例如下拉组合框,或者 -- 有人说过 ' jQuery 自动完成'?)。
  • 节省一些磁盘空间(标记一次写入)
  • 搜索很快。如果您已经知道要查找的标签并将它们预编译为标签 ID,它们将在运行时在人行道上留下 SQL 橡胶烧焦痕迹(索引搜索 整数 值!)。无法编译的标签不会存在,您甚至在搜索开始之前就会知道这一点。
  • 更容易重命名标签
  • 可以包含任意数量的标签(您可能会冒着某些标签迟早会被截断为“iOS Developm”的风险...)

我相信“CSV 字段”在 SQL 反模式 ( http://pragprog.com/book/bksqla/sql-antipatterns ) 中被删减,这是有充分理由的。

关于mysql - 选择所有字段包含以逗号分隔的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12149218/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com