2011-07-20 107 views
0

我有我的数据库字段中它命名为tag_info变量我会出现像这样的数据:用空格分隔查询MySQL数据库与数组

arm leg head forearm foot 

标签(不知道这是最好的方式所以我很乐意提供建议)

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

$ find_tags =阵列( “臂” 腿 “);

$查询=” SELECT * FROM MyDatabase的WHERE tag_info = '$ find_tags'

这是可能的?如果我的问题是没有意义的只是让我know.foot

+0

哇感谢所有伟大的反馈,我将根据你的反馈做一些研究,看看哪种解决方案最好。 – Denoteone

+0

在这里看到我的回答 http://stackoverflow.com/questions/3966416/how-do-i-select-a-row-in-mysql-that-c​​ontains-multiple-values/3966466#3966466 –

回答

2

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

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

+1

也许是一个标签表和一个用于将标签映射到原始表的表格。 – AndrewR

+0

+1是的。这可能是最好的答案,他不想听到的答案= D –

+0

我可以用标签创建另一个表格,但是我应该将它们全部存储在同一个字段中吗? – Denoteone

0

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

查询应该是这个样子

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

您也可以使用MySQL IN子句:

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

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

编辑

我刚才看到你持有的DB序列化的标签。现在,这绝对不好,因为你正在破坏结构化数据的概念。

您应该创建一个名为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') 
+0

韩元如果邮局在他的案件中有很多标签,那么他就没有用。 –

+0

现在呢? –

0

查询与where tag_info like '%arm%' or tag_info like '%leg%' 但这将是相当效率低下,更好地存储标签每行一个标签,有一个索引。

-1

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

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

如果前面或标签末尾还有空格,则不起作用。 –

+0

不,空间是必要的。他说他们是空间分开的。是的,第一个在它之前需要一个空格,最后一个需要一个空格,但是如果你不使用LIKE中的空格,搜索'%arm%'也会匹配前臂。 – AndrewR

+0

好吧,但这不是他目前的状态,你没有说明他应该在标签周围留下空白,并且这不是一个好的解决方案,因此值得-1。 –

0

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

,如果你要搜索不同的标记,也就是说,如果你只需要 $ find_tags =阵列(“胳膊,”腿“)的特定查询;其他的答案将工作

0

你可以试试。下面的查询。

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

如果您正在使用表名和字段名称是否正确,那么这可能是要紧的给你。

感谢。

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

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

0

更正确的方法是在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); 

未测试的解决方案!

1

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

所以,当你有一个标签列表,做一个查询来获得他们的id,然后查询yourdatabase_tags获取具有该tag_ids的record_ids,然后查询您的数据库的记录。或者你可以将它们组合成一个查询(这是一个留给读者的练习:))

+0

很好的解释。 – Denoteone