2009-12-03 6 views
4

Je voulais créer une base de données qui va stocker les balises que les utilisateurs saisissent pour leurs questions et les afficher toutes pour chaque question individuelle affichée; quelque chose comme ici sur SO.Comment stocker des balises dans une base de données en utilisant MySQL et PHP?

Voici le tableau qui me fait tout pour l'instant:

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

Je sais que ce n'est pas correct. De quelle autre table ou de quelles tables ai-je besoin et de quoi ai-je besoin pour passer à cette table si nécessaire?

+0

Y a-t-il une relation avec une table 'questions'? Ou est-ce que 'questions_tags' est la seule table que vous avez? –

+0

Le questions_tags est tout ce que je sais juste, c'est pourquoi je demande. – php

Répondre

2

Tables:

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

Sélectionnez l'étiquette liée à une question

SELECT  tag_id 
FROM   question_tags 
WHERE  question_id = $yourquestionid' 

Sélectionnez les questions relatives à une balise

SELECT  question_id 
FROM   question_tags 
WHERE  tag_id = $yourtagid' 

comte combien de fois un tag a été utilisé

SELECT COUNT(tag_id) 
FROM question_tags 
where tag_id=$yourtagid 

Faire un nuage de tags

SELECT COUNT(tag_id) 
FROM question_tags 
GROUP BY tag; 
+0

Le compteur incrémente les balises pour les afficher plus grandes et l'URL capture les pages. – php

+0

toutes ces choses seront dans la table de l'étiquette – Roch

+0

vous obtiendrez le compte en faisant une simple demande de compte de sql. – Roch

0

Vous feriez probablement besoin d'une table de relation m: qui stocke les relations à votre "question" n "-Tableau.

7

Vous devez diviser vos données entre deux tables, questions et tags et les associer à l'aide d'une table de jointure 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 
); 

Je ne suis pas sûr de ce que la colonne count dans votre table d'origine est pour si je sautais il. En utilisant les tableaux ci-dessus, vous pouvez utiliser des jointures pour trouver toutes les questions avec une certaine étiquette ou toutes les étiquettes d'une question.

Modifier

Pour obtenir le nombre pour chaque balise, vous pouvez à quelque chose comme ceci:

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

Modifier

Pour obtenir les comptes de tous les tags pour toutes les questions font ce:

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; 

Si vous souhaitez uniquement le nombre de tags ou de questions spécifiques, ajoutez des clauses WHERE supplémentaires.

Remarque: Tous les SQL ci-dessus n'ont pas été testés.

+0

La colonne de compte compte combien de fois chaque étiquette a été entrée par exemple, disons que le code HTML a été saisi 20 fois pour cette question. – php

+2

Une telle colonne 'count' contient des informations redondantes et ne doit pas être utilisée. –

+0

Alors, que dois-je utiliser pour garder une trace du nombre de fois que le tag a été entré pour chaque question? Par exemple, disons que la question a été saisie 5 fois pour le HTML, alors que les questions 2 ont été saisies 2 fois pour le HTML? – php

Questions connexes