如何使用MySQL和PHP在数据库中存储标记?

如何使用MySQL和PHP在数据库中存储标记?,php,mysql,Php,Mysql,我想创建一个数据库,它将存储用户为他们的问题输入的标签,然后为每个发布的问题显示所有标签;像这样的 这张桌子现在为我做了一切: CREATE TABLE questions_tags ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, url TEXT NOT NULL, tag VARCHAR(255) NOT NULL, count INT NOT NULL, PRIMARY KEY (id) ); 我知道这是不对的。我还需要哪些其他表格?如果需要,我需要

我想创建一个数据库,它将存储用户为他们的问题输入的标签,然后为每个发布的问题显示所有标签;像这样的

这张桌子现在为我做了一切:

CREATE TABLE questions_tags (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
url TEXT NOT NULL,
tag VARCHAR(255) NOT NULL,
count INT NOT NULL,
PRIMARY KEY (id)
);

我知道这是不对的。我还需要哪些其他表格?如果需要,我需要对此表格做哪些更改?

表格:

CREATE TABLE questions_tags (
tag_id INT INT NOT NULL,
question_id INT NOT NULL,
);

CREATE TABLE tags (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
tag VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
);

SQL

选择与问题相关的标签

SELECT     tag_id
FROM         question_tags
WHERE     question_id = $yourquestionid'
选择与标签相关的问题

SELECT     question_id
FROM         question_tags
WHERE     tag_id = $yourtagid'
计算标签被使用的次数

SELECT COUNT(tag_id) 
FROM question_tags 
where tag_id=$yourtagid
SELECT COUNT(tag_id)
FROM question_tags 
GROUP BY tag;
制作标记云

SELECT COUNT(tag_id) 
FROM question_tags 
where tag_id=$yourtagid
SELECT COUNT(tag_id)
FROM question_tags 
GROUP BY tag;

您可能需要一个n:m关系表来存储与“问题”表的关系。

您应该将数据分为两个表,
问题和
标签
,并使用
问题和标签
联接表将它们关联起来

CREATE TABLE questions (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  url TEXT NOT NULL,
  PRIMARY KEY (id)
);

CREATE TABLE tags (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  tag VARCHAR(255) NOT NULL,
  PRIMARY KEY (id)
);

CREATE TABLE questions_tags (
  question_id INT UNSIGNED NOT NULL REFERENCES questions,
  tag_id INT UNSIGNED NOT NULL REFERENCES tags
);
我不确定原始表中的
count
列用于什么,因此跳过了它

使用上面的表,您可以使用联接查找具有特定标记或问题的所有标记的所有问题

编辑

要获取每个标记的计数,您可以使用以下方法:

  SELECT tag,
         count(*) AS c
    FROM tags
GROUP BY tag;
编辑

要获取所有问题的所有标签计数,请执行以下操作:

  SELECT t.tag,
         q.question_id,
         count(*) AS c
    FROM tags AS t,
         questions_tags AS qt
         questions AS q
   WHERE t.id = qt.tag_id
     AND qt.question_id = q.id         
GROUP BY t.id, q.id;
如果只需要特定标记或问题的计数,请添加额外的
WHERE
子句


注意:以上所有SQL都未经测试。

是否与
问题表有任何关系?或者
questions\u tags
是你仅有的表格吗?我只知道questions\u tags,这就是我问的原因。计数会增加标记以显示更大的标记,url会捕获页面url。所有这些内容都将在标记表中。您将通过执行一个简单的sql计数请求来获得计数。那么标记表的外观如何,以及将使用哪个表来显示页面上的标记?我假设标记表将捕获每个标记的计数?计数列统计每个标记被输入的次数,例如,假设HTML为该问题输入了20次。这样的
count
列包含冗余信息,不应使用。那么我应该使用什么来跟踪每个问题输入标记的次数?例如,假设问题2为其输入了2次HTML,而问题2为其输入了5次HTML?看我的回答,有一个请求,要求计算标记使用了多少次尽管可能会有争论,为了加快SELECT查询的速度,有一个Count列可能是值得的。像count()这样的聚合函数需要额外的处理时间,据我所知,它们不会被缓存。由于标签选择查询可能会经常运行,因此有必要使其尽可能轻快。