【问题标题】:Get comma separated string from Mysql从 Mysql 获取逗号分隔的字符串
【发布时间】:2011-09-07 03:53:14
【问题描述】:

我正在像这样将一个字符串从 PHP 保存到 MySQL..

$groupid = "13, 14, 15, 16"
$write = mysql_query("INSERT INTO table VALUES ('','$groupid')");

然后我尝试从表中提取数据 if $a = "15"

$extract = mysql_query("SELECT * FROM table WHERE ustaffid='$ustaffid' AND groupid='$a'");

如何在提取时轻松地将 $groupid 中的内容与 $a 匹配?我可以用 MySQL 做到这一点吗?

【问题讨论】:

  • 您是否考虑过重构您的数据库架构以符合您的需求?在我看来,您需要 1:many 关系。
  • 确实,正如许多人所说,这突出了您的设计中的一个缺陷。利用关系数据库的固有属性并使用多个表。您只会在选择、更新、连接等方面遇到困难。它们都会变得过于复杂。

标签: php mysql arrays string


【解决方案1】:

您可以在此处使用find_in_set 函数。

SELECT * 
    FROM table 
    WHERE ustaffid='$ustaffid' 
        AND FIND_IN_SET('$a', groupid) > 0

【讨论】:

    【解决方案2】:

    如果$a 仅包含一个 id,我建议将其分成多条记录,因为在字符串搜索(/选择)中速度较慢。

    【讨论】:

      【解决方案3】:

      我不知道groupid 列中的空格是否会影响find_in_set MySQL 函数,并且正如@PeeHaa 所指出的那样,在字符串中搜索速度较慢并且难以使用索引进行优化。

      您确实应该考虑修改数据库架构并对其进行规范化,以便使用依赖表并将多个行与每个 groupid 值的主表相关联,而不是在列中保存多个值。这就是关系数据库的用途。

      【讨论】:

        【解决方案4】:

        扩展@ecchymose 的答案,您可以使用正则表达式而不是 LIKE。

        SELECT *
        FROM table
        WHERE ustaffid='$ustaffid'
        AND groupid RLIKE '(^|, )$a(, |$)'
        

        注意:您可能需要使用\ 转义最后一个$

        注意 2:这不是最佳解决方案。每个 ID 都应该有一个单独的行(ID 是 PRIMARY 键)。

        【讨论】:

          【解决方案5】:
          SELECT * 
          FROM table 
          WHERE ustaffid='$ustaffid' 
          AND groupid LIKE '%$a,%'
          

          但你必须在最后用逗号结束你的字符串。

          【讨论】:

          • 如果$a 的值是列表的最后一个元素(即末尾没有尾随逗号)怎么办?
          • 它不会找到它。这就是为什么如果您使用分隔符搜索,每个元素后面必须有一个...不是最佳解决方案,但如果您赶时间...
          猜你喜欢
          • 2017-07-22
          • 1970-01-01
          • 2014-03-22
          • 2016-09-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多