我将产品存储在带有标签的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);
如何获取唯一标记列表?以及如何在标签中搜索多个值? (所以,如果我搜索“漂亮的黄色”,它将返回奶酪。
答案 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?