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

时间:2011-07-20 04:41:59

标签: php mysql

我的数据库字段名为tag_info,我将拥有如下所示的数据:

  手臂腿部前臂脚

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

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

$find_tags = array("arm,"leg");

$query = "SELECT * FROM mydatabase WHERE tag_info = '$find_tags'

这可能吗?

10 个答案:

答案 0 :(得分:3)

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

你能告诉我你的表的架构(列名)吗?我认为这是一个你应该有两张桌子的情况。一个单独的表格,仅用于标签。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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]."%'";

答案 3 :(得分:1)

使用where tag_info like '%arm%' or tag_info like '%leg%'查询 但这样效率会非常低,最好是每行分别存储一个标签,并在其上加上索引。

答案 4 :(得分:1)

无法编写类似的查询,因为您必须动态更改WHERE等等或等等的OR语句数量。一种方法是将数据库中的所有数据都捕获到PHP数组中。一旦进入数组,您可以以编程方式搜索结果并消除那些不匹配的结果。

如果您只想搜索特定查询,则可以搜索不同的标记 $ find_tags = array(“arm,”leg“);其他答案都可以。

答案 5 :(得分:1)

您可以尝试以下查询。

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

如果您使用的是表名和字段名,那么您可能需要这样做。

感谢。

答案 6 :(得分:1)

$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";

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

答案 7 :(得分:1)

更正确的方法是使用带有availeble标签的标签表以及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);

未经测试!!

答案 8 :(得分:0)

您的查询应该类似于

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

您还可以使用MySQL IN子句:

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

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

修改

我刚看到你拿着在数据库中序列化的标签。现在,这绝对不是好事,因为你正在摧毁结构化数据的概念。

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

数据透视表只能容纳2个字段 - 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')

答案 9 :(得分:0)

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

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