在MySql数据库中存储,检索和搜索标签

时间:2014-02-02 09:42:27

标签: php mysql

我将产品存储在带有标签的mysql数据库中(现在用逗号分隔):

name       |   price   | tags
-----------------------------------------
cheese     |   6       | yellow, nice
strawberry |   3       | red, fruit
steak      |   5       | red, nice feeling, cold
rice       |   4       | white, china

现在,我想获得一个唯一标记列表,这应该返回yellow, nice, red, fruit, nice feeling, cold, white, china。我目前正在使用下面的方法,但这只检查唯一的行,而不是唯一的标记(逗号分隔值),所以我得到重复的值。

      $result = mysql_query("SELECT DISTINCT tags FROM products") or die(mysql_error());

      // check for empty result
      if (mysql_num_rows($result) > 0) {
      // looping through all results
      // products node
      while($row = mysql_fetch_array( $result )) {               
            // echo out the contents of each row into a table
            if  (!empty($row["tags"])){
            echo  "The tags are: ".$row["tags"] ;
            }
       } 

另外,我想搜索数据库,我已经开始工作了:

       $ref = $tags;
       $query = "SELECT * FROM products WHERE INSTR(tags,'".mysql_real_escape_string($ref)."')>'0'";
       $result = mysql_query($query);

如何获取唯一标记列表?以及如何在标签中搜索多个值? (所以,如果我搜索“漂亮的黄色”,它将返回奶酪。

2 个答案:

答案 0 :(得分:2)

使用给定结构的单个查询获取唯一标记并不简单。其他人建议做的最好的事情是规范化数据,这将有助于搜索,获取独特数据等许多操作。

现在第一个问题是获得它的一种方法

select distinct reverse(substring_index(reverse(substring_index(tags, ',', n.n)), ',', 1)) as tags
from products cross join
     (select 1 as n union all select 2 as n union all select 3 as n union all select 4 as n) n
having tags is not null

请参阅此处的输出http://www.sqlfiddle.com/#!2/d9a42/18

现在搜索字符串模式是直接执行它的一个大问题,因此您可能需要在PHP中拆分字符串,然后像使用AND一样使用,以确保您搜索的所有标记都返回到结果中。

使用规范化的表结构,这将更加容易。

答案 1 :(得分:1)

您应该阅读有关数据规范化的内容。实质上,您应该单独存储标签。然后每个标签都有一个ID,每个产品都有一个ID。产品和标签有很多关系,这意味着您将拥有一个将标签链接到产品的表格。

您应该阅读以下问题:Is storing a delimited list in a database column really that bad?