使用PHP搜索存储在mySql列中的数组的最快方法

使用PHP搜索存储在mySql列中的数组的最快方法,php,mysql,Php,Mysql,我试图找到一种更好的方法来搜索mySql数据库中存储的数组,以确定是否要从该行返回值。目前我正在解析整个数组,如果它包含我想要的内容,我将继续执行我想要执行的任何操作,如果它不包含,我将转到下一行。超慢的 我将数组存储在一列中,我们称之为category。例:1,zzz31zzz,31,4,5 我想搜索该列,如果它包含“31”,继续操作我的数据 因此,我访问数据库的方式如下: $sql = "SELECT * FROM db WHERE arg=1 AND category != ''"; $s

我试图找到一种更好的方法来搜索mySql数据库中存储的数组,以确定是否要从该行返回值。目前我正在解析整个数组,如果它包含我想要的内容,我将继续执行我想要执行的任何操作,如果它不包含,我将转到下一行。超慢的

我将数组存储在一列中,我们称之为category。例:1,zzz31zzz,31,4,5

我想搜索该列,如果它包含“31”,继续操作我的数据

因此,我访问数据库的方式如下:

$sql = "SELECT * FROM db WHERE arg=1 AND category != ''";
$sqlresult = mysql_query($sql);
while($row = mysql_fetch_array($sqlresult))
{
  $vals = explode(',', $row['category']);
  foreach($vals as $val)
  {
    if($val == 31)
    {
      //do something
    }
    else
    {
    //dont
    }
  }
}
我觉得有一个明显的答案,我只是没有想到。有人能提出更好的选择吗?我将以这种方式处理数千个数组,而3需要将近半秒的时间。我会犹豫是否在搜索中使用通配符,因为我可能有“1311”等数据。。我需要搜索一个特定的变量

--
谢谢大家的及时回复。我将在几个小时内在这里测试它们。我感谢您的建议。

意味着您的分隔符是

WHERE `category` REGEXP ',?[SEARCHED-VALUE],?';
那么这个呢:

$sql = "SELECT * FROM db WHERE arg=1 AND (category LIKE '%,31,%' OR category = 31 OR category LIKE '31,%' OR category LIKE '%,31'";
如果我得到了你想要的,你就不会匹配1311等等

否则,请查看
REGEXP SQL函数

检查此项:->

while($row = mysql_fetch_array($sqlresult))
  {
  $vals = explode(',', $row['category']);
  IF(in_array('31',$vals)
   {
    //do something
   }
  else
   {
    //dont
    } 
  }


您可以与mysql查询一起使用

是否需要其他地方没有val==31的行?为什么不在获取mysql之前过滤它?您必须规范化数据库。我不需要不包含特定变量的行。克里斯蒂安,怎么过滤?显而易见的答案是使你的数据正常化。@Jack Right,编辑了这个。不管怎样,我不喜欢这件事。我会重新设计数据库方案,以另一种方式存储类别。我不确定OP是否能做到这一点。我会在早上试试看它的表现如何。我认为组织数据库的唯一其他方法是设置列,如1、2、3、31等,如果行包含我正在搜索的变量,则将行标记为1或0。这将需要更长的时间来建立。。。但是可能会提供显著的速度性能吗?@user1129107您可以创建一个新表
CATEGORIES(id,category,other_key)
,其中
other_key
是第一个表的外键。然后,您可以通过连接表来查找给定键(和so id)的所有类别。还有很多其他的解决方案,也许你应该学习更多关于关系数据库的知识。谢谢你的建议。我一回到电脑就会查出来。谢谢你的快速回复。我会在几个小时内检查所有这些。