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

时间:2009-12-03 09:40:37

标签: php mysql

我想创建一个数据库,用于存储用户为其问题输入的标记,然后针对发布的每个问题显示所有标记;像SO这样的东西。

以下表格现在为我做了一切:

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)
);

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

3 个答案:

答案 0 :(得分:7)

您应该在两个表questionstags之间拆分数据,并使用questions_tags联接表关联它们。

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都是未经测试的。

答案 1 :(得分:2)

<强>表格

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;

答案 2 :(得分:0)

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