【问题标题】:"Stack" or "Add" MySQL results... or something“堆栈”或“添加” MySQL 结果......或其他东西
【发布时间】:2013-09-10 08:43:49
【问题描述】:

让我开始吧。 我有一个带有文本行的 MySQL 表。例子... 条目 |标签 帖子1 |标签,标签1,标签4 帖子2 |标签1,标签2,标签4 我想抓取所有标签并显示标签和它的使用次数。例子... 标签 (1) 标签 1 (2) 标签 4 (2) 标签 2 (1) 我能用我目前的设置做到这一点吗?感谢您的宝贵时间。

我建立了一个名为“标签”的新表。就是这个样子……

ID | POSTID | TAG
1       1     tag1
2       1     tag2
3       2     tag5
4       3     tag2
5       3     tag2

现在,我该如何构建一个看起来像这样的列表?

tag1 (1)
tag2 (3)
tag5 (1)

【问题讨论】:

  • 你应该normalize你的表,将标签存储在一个新表tags中,这样会更容易。
  • 逗号分隔列表....嗯,我祝您旅途愉快。 :)
  • 如果标签是未知的,我认为没有存储过程是无法解决的。为关系数据库使用正确的结构(如@MahmoudGamal 所说)
  • 绝对规范化您的表格。单独的标签表有一些优点。您当前的设置需要解析所有条目或执行解析的一些存储过程。
  • 这仍然不是一个好的数据库模式。请参考我下面的留言。但是如果你想保留这个模式,你可以这样做:SELECT tag, COUNT(id) FROM tags GROUP BY tag

标签: php mysql


【解决方案1】:

你可以这样做,但在 PHP 中解析标签是最简单的,所以对于所有标签:

$tagcount = array();
$query = "SELECT tags from table";
$result = mysqli_query($query);
while ($row = mysqli_fetch_array($result)) {
    $tags = explode(',', $row['tags']);
    foreach ($tags as $tag) {
    $tag = trim($tag);
        if (array_key_exists($tag, $tagcount)) {
            $tagcount[$tag]++;
        } else {
            $tagcount[$tag] = 1;
        }
    }
}
foreach ($tagcount as $key=>$value) {
     echo "<p>$key used $value time(s)";
}

希望对你有帮助

编辑:正如其他人所说,从长远来看,使用单独的标签表会更有效/更容易。

【讨论】:

  • 它会起作用,但你应该明确地考虑改变你的数据库架构。如果您有大量数据,此代码将非常耗时。
  • 我同意,在我的答案底部添加了注释。
【解决方案2】:

你应该有这样的东西:

条目表:

id (auto-increment, primary) | EntryName
0                              Entry1
1                              Entry2

标签表:

id (auto-increment, primary) | TagName
0                              Tag1
1                              Tag2

EntryHasTag 表:

id_entry | id_tag
0          1
0          2
1          1
1          2

然后,你可以这样做:

SELECT COUNT(e.id_tag) FROM EntryHasTag e LEFT JOIN Tags t ON e.d_tag = t.id GROUP BY e.id_tag

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多