【问题标题】:MySQL: can I do a for-each on a comma separated field?MySQL:我可以在逗号分隔的字段上做一个 for-each 吗?
【发布时间】:2011-02-10 03:02:59
【问题描述】:

我刚刚遇到了一个问题。

我知道这些整数,$integers: 3,5,15,20。

我只想从下表中选择在字段 NUMBERS 中找到所有逗号分隔的 INT 的行。

TABLE: number_table
Uid Numbers
------------------------
1   3,5,15    OK, since all of NUMBERS are in $integers
2   5,15,20   OK, since all of NUMBERS are in $integers
3   3,4,5,15  NOT OK, since 4 is not found in $integers
4   2,15,20,25  NOT OK, since 2 and 25 is not found in $integers

是否可以对逗号分隔的字符串执行“for-each”或以其他方式执行此 SELECT?

更新:听起来这是不可能的。我会把它留在这里一会儿。只是一个提示。当在逗号分隔的字符串中搜索某些内容时,MySQL 会提供 WHEERE something IN(逗号分隔的字符串)。我所寻找的是以某种方式使用 MySQL 遍历逗号分隔的字符串,但这可能是不可能的。

这样的事情会做(伪代码):

SELECT * FROM number_table WHERE each_commaseparated_substring(Numbers , 'IN (3,5,15,20)')

【问题讨论】:

    标签: mysql select foreach csv


    【解决方案1】:

    它不应该是逗号分隔的字段。 它必须是相关表中的行。

    【讨论】:

    • "must" 很强大...但是标准化数据(另一个表中的每个项目一行)要好得多。
    • 良好的“最佳实践”。但是有几个应用程序使用逗号分隔值。在我的工作中,我还必须能够在需要时从这些应用程序数据库中提取数据。当仅用于一对多关系并且很少进行反向查找时,我经常发现关系存储为逗号分隔值。 Pro:更简单的数据库图。缺点:数据库未标准化
    【解决方案2】:

    我还没有尝试过,它有点难看而且很可能很慢,但你可以尝试以下。

    3,5,15,20

    SELECT * FROM number_table
    WHERE Numbers (LIKE '%,3,%' OR LIKE '%3,%') AND Numbers LIKE '%,5,%' AND Numbers LIKE '%,15,%' AND Numbers (LIKE '%,20,%' OR LIKE '%,20%')
    

    您可以使用 REGEX 做一些事情。但至少你可以使用存储过程。

    为正确性更新

    【讨论】:

    • 嗨。这是在归档数字中搜索所有 $integers 的另一种方式。它应该是所有逗号分隔的 int 字段整数应该在 $integers 中找到
    • 第二件事。仅搜索 %,3,% 是不够的。对于每个 INT,它必须是对 '%,3,%' OR '3,%' OR '%,3' 的搜索,因此还要检查字符串的开头和结尾。
    • 否则。感谢您的反馈和帮助 :-) 很抱歉听起来如此消极,我非常感谢所有答案和 cmets。
    • 忘记了:在搜索逗号分隔的字符串时,您应该使用 IN 而不是 LIKE。见页面约三下:webdevelopersnotes.com/tutorials/sql/…
    • @Tilebeck:您是正确的,需要 %,3,% OR %3,% 以及 %,20,% OR %,20%。但是,我希望看到您使用“IN”子句重建选择状态。正如你所说,永远不应该使用 LIKE 运算符,并且应该始终用“IN”子句替换,这是一个错误的陈述。让我问你这个,通配符可以与'IN'子句一起使用吗?
    【解决方案3】:

    也许可以尝试使用 PHP 和 implode() 函数连接代码。

    【讨论】:

    • 好像不能一次通话。猜你是对的,我必须使用php。如果我找到更好的解决方案,我会在这里发布并告诉你正确的答案
    【解决方案4】:

    正确的简短答案是否定的,但尽管是非正常数据,但有些解决方案很难看,因此不推荐。专门做一个拆分字符串函数,并用存储过程遍历每个值。

    【讨论】:

      【解决方案5】:

      您可以检查逗号的数量是否比找到的搜索词的数量少一:

      SELECT * FROM number_table
      WHERE CHAR_LENGTH(Numbers) - CHAR_LENGTH(REPLACE(Numbers, ',', '')) = -1
        + (FIND_IN_SET( 3, Numbers) > 0)
        + (FIND_IN_SET( 5, Numbers) > 0)
        + (FIND_IN_SET(15, Numbers) > 0)
        + (FIND_IN_SET(20, Numbers) > 0)
      

      使用 PHP 从$integers 创建它:

      $sql = "SELECT * FROM number_table
              WHERE CHAR_LENGTH(Numbers) - CHAR_LENGTH(REPLACE(Numbers, ',', '')) = -1";
      
      foreach ($integers as $i) $sql .= " + (FIND_IN_SET($i, Numbers) > 0)";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多