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

php*_*php 4 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)
);
Run Code Online (Sandbox Code Playgroud)

我知道这不对.我还需要哪些其他表格,如果需要,我需要更改哪个表格?

小智 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
);
Run Code Online (Sandbox Code Playgroud)

我不确定count原始表中的列是什么,所以我跳过它.

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

编辑

为了获得每个标签的计数,你可以这样:

  SELECT tag,
         count(*) AS c
    FROM tags
GROUP BY tag;
Run Code Online (Sandbox Code Playgroud)

编辑

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

  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;
Run Code Online (Sandbox Code Playgroud)

如果您只想要特定标签或问题的计数,请添加其他WHERE条款.

注意:上面的所有SQL都是未经测试的.

  • 这样的`count`列包含冗余信息,不应该使用. (2认同)