将 MySQL 内爆数组中的项目与查询中的 PHP 数组匹配

Posted

技术标签:

【中文标题】将 MySQL 内爆数组中的项目与查询中的 PHP 数组匹配【英文标题】:Match items in MySQL imploded array to PHP array in query 【发布时间】:2013-03-20 22:52:37 【问题描述】:

我是数据库新手,如何通过将 php 数组中的项与 mysql 内爆数组中的项进行匹配来搜索行?出于方便,它是这样存储的,但如果有更好的方法来做我想做的事,我会全力以赴。我正在寻找这样的东西(我使用 ** 来指示我在哪里挥手):

$sql = "SELECT * FROM codeunits";
$sql .= " WHERE CASE WHEN private=1 THEN creatorID=:userID ELSE true END";
if (isset($tags))

  $tag_ids = join(',',$tags);
  $sql .= " AND ****items in mysql array 'tags'  IN :tags";
  if($stmt = $this->_db->prepare($sql)) 
    $stmt->bindParam(":userID", $userID, PDO::PARAM_STR);
    $stmt->bindParam(":tags", $tag_ids, PDO::PARAM_STR);
    $stmt->execute();
    $stmt->closeCursor();
  

这是我将项目存储到数据库中的方式。 $values 绑定到 tags 列的查询,因此我称它为 MySQL 数组。

    $tags = array();
    foreach ($_POST['tags'] as $selectedOption)
    
        $tags[] = $selectedOption;
    
    $values  = implode(",",array_values($tags));
    $sql = "INSERT INTO "
      ."codeunits(tags)"
      ." VALUES(:tags)";
      if($stmt = $this->_db->prepare($sql))              
          $stmt->bindParam(":tags", $values, PDO::PARAM_STR);
          $stmt->execute();

          $stmt->closeCursor();

          return true;
        

这会在我的数据库中产生一个看起来像“tag1,tag2,tag3”的条目。很简单的字符串。

【问题讨论】:

mysql 没有数组... 是的,我澄清了我的意思。我正在使用一个 PHP 数组,我将它内爆成一个字符串,然后将其存储。我要与数组进行比较的正是这个字符串。 你在哪里实际使用 $values? 您不能将 PHP 数组内爆为字符串并在查询中将其用作单独的值。您需要为每个 MySQL 添加一个占位符并分别绑定它们。 你真的告诉我,如果我有一个像“SELECT .. FROM ... WHERE a='1'”这样的查询,我必须这样做:“SELECT .. FROM .. . WHERE a = :one" 然后将 :one 绑定到 1? 【参考方案1】:

对于此类查询,这不是一个好的数据库设计,您必须使用 LIKE 来查找标签。

相反,您应该有一个表格“tags”,每行包含一个标签,然后您可以使用带有“IN”语句的连接:

SELECT * FROM codeunits JOIN tags ON tags.codeunit_id=codeunits.ID WHERE tags.name IN (:tags) AND CASE WHEN private=1 THEN creatorID=:userID ELSE true END

【讨论】:

如果他有一个庞大的项目需要维护,你的“应该”解决不了问题! 现在没有时间修复它;) @Mike 是肯定的,而且在他的问题中,他说“出于方便,它是这样存储的,但如果有更好的方法来做我想做的事,我会全力以赴” 事实上,我确实按照您的描述设置了一个“标签”表。我只是不熟悉做这样的操作。你所拥有的看起来很有希望,但我在标签中没有 codeunit_id 列。有必要加入某事吗?我打算建立从代码单元到标签的一对多关系。 不,你应该有一个从标签到 codeunits 的 one:many 关系或 many:many 关系,在这种情况下你需要第三个 table codeunits_tags 但这取决于你的需要。

以上是关于将 MySQL 内爆数组中的项目与查询中的 PHP 数组匹配的主要内容,如果未能解决你的问题,请参考以下文章

将数组内爆为来自 mysql 查询的逗号分隔字符串

Laravel 查询:Php 内爆数组字符串值 [重复]

序列化数组中的mysql选择查询

PHP内爆爆炸第一个和最后一个数组值

PHP相交与MySQL相交

如何对数组php中的所有项目运行sql查询