2010-12-15 34 views
0

J'ai une table de contenu qui peut avoir des longueurs de résultats variables et des balises associées à chaque ligne. Je ne sais pas comment obtenir toutes ces informations pour un contenu en un seul coup.Joindre des éléments de contenu avec des longueurs variables de commentaires et de balises: D

Je peux facilement faire une requête pour obtenir l'information de contenu (id) et interroger chaque table pour les commentaires et les balises, mais cela ne semble pas avoir beaucoup de sens comme s'il y avait une meilleure façon.

Des conseils ou des suggestions? Merci d'avance!

Thomas

Ma requête ressemble beaucoup comme SO:

SELECT c.*, GROUP_CONCAT(tagWords.tagWord SEPARATOR ', ') AS tags FROM platform.contents c 
LEFT OUTER JOIN platform.contentTags ON contentTags.contentId = c.contentId 
LEFT OUTER JOIN platform.tagWords ON contentTags.tagId = tagWords.tagId 
WHERE c.contentType = 'album' LIMIT 10 

GROUP_CONCAT est grand et tout, mais je besoin des champs de chaque table et les tables pousseront. :/

Mes mises en page de table:

mysql> explain contentComments; 
+--------------+---------------------+------+-----+-------------------+-------+ 
| Field  | Type    | Null | Key | Default   | Extra | 
+--------------+---------------------+------+-----+-------------------+-------+ 
| contentId | bigint(19) unsigned | NO | MUL | NULL    |  | 
| userId  | bigint(19) unsigned | NO |  | NULL    |  | 
| message  | varchar(255)  | YES |  | NULL    |  | 
| stampCreated | timestamp   | NO |  | CURRENT_TIMESTAMP |  | 
+--------------+---------------------+------+-----+-------------------+-------+ 
4 rows in set (0.00 sec) 

mysql> explain contentTags; 
+-----------+------------+------+-----+---------+-------+ 
| Field  | Type  | Null | Key | Default | Extra | 
+-----------+------------+------+-----+---------+-------+ 
| contentId | bigint(20) | NO | MUL | NULL |  | 
| tagId  | bigint(20) | YES |  | NULL |  | 
+-----------+------------+------+-----+---------+-------+ 
    2 rows in set (0.00 sec) 

mysql> explain contents; 
+------------------+-----------------------------------------+------+-----+-------------------+----------------+ 
| Field   | Type         | Null | Key | Default     | Extra   | 
+------------------+-----------------------------------------+------+-----+-------------------+----------------+ 
| contentId  | bigint(20)        | NO | PRI | NULL    | auto_increment | 
| contentType  | enum('video','album','blogpost','news') | NO |  | NULL    |    | 
| userId   | bigint(19) unsigned      | NO | MUL | NULL    |    | 
| contentTitle  | varchar(45)        | YES |  | NULL    |    | 
| contentDesc  | varchar(255)       | YES |  | NULL     |    | 
+------------------+-----------------------------------------+------+-----+-------------------+----------------+ 

mysql> explain tagWords; 
+---------+---------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+---------+---------------------+------+-----+---------+----------------+ 
| tagId | bigint(19) unsigned | NO | PRI | NULL | auto_increment | 
| tagWord | varchar(45)   | YES |  | NULL |    | 
+---------+---------------------+------+-----+---------+----------------+ 
2 rows in set (0.00 sec) 

Répondre

0

Ce looks droit à moi, mais je pense que vous avez aussi besoin d'un group_concat pour commentaires. Il se pourrait que votre cerveau ne soit pas à l'aise avec l'idée de relations N à N dans une base de données, ce qui serait étrange si l'on considère que vous l'avez bien fait: p

+0

Merci pour la réponse Matt. Mon problème est que chaque commentaire, ou tag, a plusieurs colonnes/champs dont j'ai besoin sur le front-end. Donc, une virgule délimitée par une chaîne n'est pas nécessairement une correction .. à moins que je ne veuille entrer dans un buch d'exploser. –