如果结果匹配,则将MySQL结果限制为1

时间:2010-12-07 09:20:36

标签: php mysql

我正在创建一个博客,而我正在开发一个标签系统,海报可以在其中添加标签。标签按空格分隔,并将显示在首页,供访问者按标签浏览帖子。我正在使用explode来分隔每个帖子标记字段中的标记,但我遇到了一个问题。

现在,我可以单独列出所有标签。我将它们列在ul列表中,但会发生的情况是,每个帖子的标签都显示在单独的ul中,而不是一个ul中,用于所有帖子中的所有标签。所以我要做的是只显示一个标签,如果有更多的标签,所以如果多个帖子使用PHP作为标签,首页上的列表只会显示PHP一次。这怎么可能?

4 个答案:

答案 0 :(得分:1)

    <?php
        $query="SELECT post_tags FROM post";
        $post_tags=mysql_query($query);
        if ($post_tags)
        {
            while($row=mysql_fetch_assoc($post_tags))
            {
                $tags_string .= $row['post_tags']. " ";
            }
        }
        $tags = explode($tags_string, " ");
        $tags = array_unique($tags);
    ?>

答案 1 :(得分:0)

SELECT DISTINCT

答案 2 :(得分:0)

您可以使用array_unique函数从数组中删除重复值。

像这样:

$tags=array_unique($tags);

答案 3 :(得分:0)

尝试应用逻辑。

你的'爆炸'会像行一样重复多次。

如果您只选择一个标签,那么您应该得到所需的

您可以使用

执行此操作
SELECT post_tags 
FROM post
GROUP BY post_tags

同样可以实现

SELECT DISTINCT post_tags
FROM post

当然,您可以在应用程序级别执行相同操作,但随后您不必要地将数据从数据库层传输到应用程序层。

修改 (基于错误假设的初步答案) 根据您目前的设计,您打破了1NF,这会产生各种不良影响。 我列举一些:

  • 搜索具有特定标记的所有帖子时效果不佳
  • 想要获取每个标记下的帖子数量或获得最常用标签的低性能和复杂查询
  • 显示单一帖子的体面速度

其他查询也会受到设计决策的影响,即将多个值放在一个属性中(例如,如果您需要重命名或删除标记,或者如果您最终在名称中设置了空格,则会有一些真正的乐趣等待等等......)

通常你不是在数据库中这样做,而是你做三个表

Posts(PostKey)

PostsTags(PostKey,TagKey)

Tags(TagKey)

然后,当您要标记条目时,为每个标记插入一行。

这允许所有上述查询方案具有适当的速度 - 通常会对数据库进行规范化 - 使您的系统在各种查询中都能正常运行。