使用数组中的变量查询MySQL数据库


query MySQL database with variables from an array

我有一个名为tag_info的数据库字段,其中的数据如下所示:

臂腿头前臂脚

标记由空格分隔。(不确定这是否是最好的方式,所以我愿意接受建议(

现在我需要编写一个查询,它将返回tag_info字段中具有特定标记的所有行。但我正在寻找的标签并不都需要存在——至少有一个需要。

$find_tags = array("arm,"leg");
$query = "SELECT * FROM mydatabase WHERE tag_info = '$find_tags'

这可能吗?

您可能应该首先更改数据库模式。而不是存储由空格分隔的标签。

你能给我看一下你的表的架构(列名(吗。我认为在这种情况下,你应该有两张桌子。一个单独的表,只用于标记。

这不是进行标记的好方法。您应该有一个标签表(id,name(,yourdatabase_tags(yourdatabaserecord_id,tag_id(,这样您就可以将数据库表中的记录与标签表中的标签相关联。

因此,当您有一个标签列表时,执行查询以获取它们的ID,然后查询您的database_tags以获取具有该标签ID的记录ID,然后在数据库中查询记录。或者您可以将它们组合成一个查询(这是留给读者的练习:((

Mysql语法不能以这种方式工作

在这里什么会起作用。

$query = "SELECT * FROM mydatabase 
          WHERE tag_info = '".$find_tags[0]."' OR tag_info = '".$find_tags[1]."'";

在您的情况下,由于标签都在一个字段中,您可以使用通配符:%

$query = "SELECT * FROM mydatabase 
          WHERE tag_info LIKE '%".$find_tags[0]."%' OR tag_info LIKE '%".$find_tags[1]."%'";

使用where tag_info like '%arm%' or tag_info like '%leg%'查询但这将是非常低效的,最好是单独存储标签,每行一个标签,上面有一个索引。

不可能编写这样的查询,因为您必须动态更改WHERE中OR语句的数量。一种方法是将数据库中的所有数据抓取到PHP数组中。一旦进入数组,您就可以通过程序搜索结果,并消除不匹配的结果。

如果你想搜索不同的标签,如果你只需要一个特定的查询$find_tags=数组("arm","leg"(;其他答案会起作用。

您可以尝试以下查询。

$query = "SELECT * FROM mydatabase WHERE tag_info IN ('$find_tags');

如果您使用的表名和字段名正确,那么这对您来说可能是必要的。

谢谢。

$keywords = array("arm", "leg");
$length = count($keywords);
$searchCriteria = '';
for($i = 0; $i < $length; $i++)
{
    $searchCriteria = $searchCriteria . "tag_info like '%" . $keywords[$i] . "%'";
    if( ($i+1) < $length)
        $searchCriteria = $searchCriteria . " OR ";
}
$query = "SELECT * FROM mydatabase 
          WHERE $searchCriteria";

您可能需要添加一些额外的检查,以确保在包含标记的数组为空时不会出错。

更正确的方法是有一个包含可用标签的标签表,以及一个tag_info和tag_table之间的链接表。

但这里有一个查询的解决方案

$query = "SELECT * FROM mydatabase WHERE ";
foreach($find_tags as $tag)
{
$query .= "tag_field LIKE %$tag% OR ";
}
$query = substr($query, 0, strlen($query) - 3);

未测试!!

当然,在WHERE子句中使用LIKE而不是=。

SELECT * FROM mydatabase WHERE tag_info LIKE '% foot %' or tag_info LIKE '% leg %'

您的查询应该看起来像

SELECT * FROM mydatabase WHERE tag_info = 'arm' OR tag_info = 'leg'

您也可以使用MySQL IN子句:

SELECT * FROM mydatabase WHERE tag_info IN ('arm', 'leg')

这种方式更容易构建查询字符串

编辑

我刚刚看到您持有数据库中序列化的标签。现在,这肯定不好,因为您正在破坏结构化数据的概念。

您应该创建一个名为tags的表,并将每个标记保存在自己的行中。然后在要标记的表(现在包含序列化标记的表(和标记表之间创建另一个透视表。

数据透视表只能包含两个字段——main_table_idtag_id——这样,您就可以通过一个连接来查询数据库,比如:

SELECT t.* FROM tags t 
     INNER JOIN pivot_table pt ON pt.tag_id = t.id
     INNER JOIN main_table mt ON mt.id = pt.main_table_id
WHERE tag IN ('arm', 'leg')