【问题标题】:Find MySQL DB rows with a match in a pipe delimited column在管道分隔的列中查找具有匹配项的 MySQL DB 行
【发布时间】:2014-07-07 23:10:01
【问题描述】:

我正在查询一个表,该表有一个列,其中 member_ids 填充在管道分隔的字符串中。我需要返回与特定 member_id 存在“完全”匹配的所有行。如何处理字符串中可能与我的 ID 的“部分”匹配的其他 ID?

我可能有如下几行:

1|34|11|23
1011
23|1
5|1|36
64|23

如果我想返回 member_id 为“1”(第 1、3 和 4 行)的所有行,则无需提取所有行并分解列以检查结果数组中的任何项目是否匹配。

【问题讨论】:

  • 你可以用逗号REPLACE() | 并将其提供给FIND_IN_SET()。肯定会很慢。如果您有能力对其进行重构并将其正确规范化为一对多表关系,那么这是一个更好的长期计划。
  • 事实上,这正是那个实现:stackoverflow.com/questions/18850372/…
  • @MichaelBerkowski 感谢您的建议。这是由第三方加载项存储在 CMS 中的数据。与其尝试使用它,不如使用更明智的底层存储方法简单地编写我自己的解决方案可能更明智。 :)

标签: mysql regex delimiter


【解决方案1】:

MySQL 的正则表达式支持匹配单词边界的元字符类:

SELECT ...
FROM mytable
WHERE member_ids REGEXP '[[:<:]]1[[:>:]]'

http://dev.mysql.com/doc/refman/5.6/en/regexp.html

如果您不喜欢这样,您可以使用更简单的正则表达式进行搜索,但您必须转义管道,因为它们对正则表达式具有特殊含义。而且您还必须转义转义的反斜杠,以便将文字反斜杠传递给正则表达式解析器。

SELECT ...
FROM mytable
WHERE member_ids REGEXP '\\|1\\|'

如果您修改字符串以在字符串的开头和结尾包含分隔符,则可以在一个表达式中执行此操作。那么您不必为字符串的开头和字符串的结尾添加特殊情况。

请注意,这必然会进行表扫描。没有办法在 MySQL 中索引正则表达式匹配。我同意@MichaelBerkowski,您最好将成员ID存储在从属表中,每行一个ID。然后,您可以搜索和排序以及管道分隔的字符串使您感到尴尬、低效或不可能的各种其他事情。另请参阅我对Is storing a delimited list in a database column really that bad?的回答

【讨论】:

  • 感谢您的回复比尔。真的很有帮助。 :)
【解决方案2】:

'|'在 REGEXP 中具有特定含义。因此,假设 id 由另一个分隔符分隔,例如“~”。 然后就可以运行这段代码了:

SELECT * FROM `t1`
    where (Address Regexp '^1~') or 
        (Address Regexp '~1$') or
        (Address Regexp '^1$') or
        (Address Regexp '~1~')

【讨论】:

    猜你喜欢
    • 2013-03-17
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2019-01-18
    • 2020-10-03
    • 1970-01-01
    相关资源
    最近更新 更多