2010-09-18 14 views
3

J'ai 2 tables: l'une stocke les étiquettes, l'autre stocke les articles. Il y a un mode "Obtenir des articles par étiquette", qui prend essentiellement tous les articles, étiquetés "x". Dans mon tableau d'articles j'utilise un fichier, appelé Tags, qui stocke les données dans un tel modèle 'tag1, tag2, tag3, ...'.Sous-requête compliquée - est-ce possible?

Je veux obtenir un travail de tout en une seule requête comme ça:

SELECT *, 
     (SELECT tagname 
      FROM `tags_table` 
     WHERE tagurn LIKE 'x') as TAGNAME 
    FROM `articles_table` 
WHERE (Tags LIKE 'TAGNAME,%' OR Tags LIKE '%, TAGNAME' ... and so on) 

Je ne sais pas s'il est encore possible, mais je voudrais vraiment utiliser une seule requête (avec sous-requête) au lieu de deux différents.

Répondre

6

Ceci est la mauvaise façon de stocker une relation plusieurs-à-plusieurs dans une base de données.

Vous devriez avoir un schéma comme:

 articles: [PK] article_id, ... (should have no reference to tags) 
     tags: [PK] tag_id, tag_name, ... 
articles_tags: [FK] article_id, [FK] tag_id 

[PK] = clé primaire, [FK] = clé

étrangère Où articles_tags est un junction table. Maintenant, vous pouvez obtenir tous les articles avec une étiquette donnée avec (si vous connaissez le tag_id vous avez même pas besoin du JOIN):

SELECT article_id, ... 
     FROM articles_tags 
INNER JOIN tags ON tags.tag_id = articles_tags.tag_id 
    WHERE tag_name = 'TAGNAME'