Как хранить метки в базе данных с помощью MySQL и PHP?

Я хотел создать базу данных, в которой будут храниться теги, которые пользователи вводят для своих вопросов, и затем отображать их все для каждого отдельного вопроса; что-то вроде здесь на 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) ); 

Я знаю, что это неверно. Какие еще таблицы или таблицы мне нужны и что мне нужно изменить в этой таблице, если это необходимо?

Solutions Collecting From Web of "Как хранить метки в базе данных с помощью MySQL и PHP?"

Вы должны разделить свои данные между двумя таблицами, questions и tags и связать их с помощью таблицы questions_tags join.

 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 выше не проверены.

Таблицы:

 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; 

Вам, вероятно, понадобится таблица отношений: m, которая хранит отношения к вашему «вопросу» -Таблицу.