2011-05-20 6 views
5

J'essaie d'apprendre MySQL, j'ai donc créé un petit système de blog.MySQL: Obtenir des messages de catégories

J'ai 3 tables MySQL:

posts:

id | title  
---------------- 
1  | Post Title 1   
2  | Post Title 2 

categories:

id | title   | parent 
-------------------------------- 
10  | category10 | 0 
11  | category11 | 0 
12  | category12 | 10 

post_category_relations:

id | post_id | category_id 
---------------------------------- 
1  | 1   | 10 
2  | 2   | 12 
3  | 3   | 11 

Chaque poste peut avoir plusieurs catégories, leur relation est stockée dans post_category_relations:

Alors, quand je visite index.php catégorie = 10, je voudrais obtenir chaque poste ce qui est lié à category10, y compris les postes de sa dossier enfant category12 ainsi.

Mon Unfinished Snippet en PHP

$folder_id = $_GET["category"]; // Get Category ID from the URL 
$sql = "SELECT * FROM posts 
      JOIN categories 
      JOIN post_category_relations 
     // And I don't really know what should I do here 
     // because I need the child categories first, then the relations 
     // then I can get the post too from the post_id of the relations 
     "; 
mysql_query($sql); 

Je sais que cela nécessitera des compétences MySQL avancé, mais toute aide est appréciée! Je l'ai déjà fait en PHP mais j'ai besoin d'utiliser 4 boucles ce qui n'est pas la meilleure façon de le faire quand c'est possible en MySQL, je ne sais pas encore comment :)

+1

d'abord si vous devez échapper à votre entrée get avant de faire une requête (pour empêcher les injections SQL) this: $ folder_id = $ _GET ["category"]; devrait être: $ folder_id = mysql_real_escape_string (stripslashes ($ _ GET ["category"])); – Tim

+0

Je vous suggère également de lire les articles @Denis fournis. Vous apprendrez beaucoup :) Je les ai lu moi-même plusieurs fois. – Rifat

+0

Utilisez les variables de session MySQL: http://explainextended.com/2009/09/29/adjacency-list-vs-nested-sets-mysql/. Voir aussi cette question pour d'autres options: http://stackoverflow.com/questions/4048151/what-are-the-options-for-storing-hierarchical-data-in-a-relational-database – orangepips

Répondre

0

Je ne suis pas en mesure de tester ma requête, mais je crois quelque chose comme

select * from posts,post_category_relations where post.id=post_category_relations.post_id and 
post_category_relations.category_id in (select id from categories where id=? or parent=?) 

est ce que vous cherchez.

+0

Ça ne marchera que pour une seule profondeur – Rifat

+0

@Rifat et où dans la question est-il mentionné que les catégories ne sont pas dans un arbre à une seule profondeur? Citant: «Alors quand je visite index.php? Category = 10, je voudrais aussi obtenir chaque poste ce qui est lié à la catégorie10, y compris les messages de sa catégorie de dossier enfant12». – amal

+0

la structure de la table elle-même est pour multiniveau n'est-ce pas? – Rifat

4

Vous trouverez probablement ces articles par Phillip Keller intéressant:

Ils couvrent les balises, mais vos requêtes (c.-à-category1 and category2 vs category1 or category2, et celui que vous essayez d'écrire) sera presque identique.

Voir aussi cette discussion sur l'indexation de données hiérarchiques: Managing Hierarchical Data in MySQL.

En plus des multitudes de discussions sur SO qui ont trait à des ensembles imbriqués, les balises, les catégories, etc.

+0

étiquettes ne peuvent pas être utilisés dans ce cas, seul arbre (avec des chemins, je suppose). Donc +1 pour le lien hiérarchique, mais vous pourriez écrire réponse plus détaillée. –

+1

Ouais, je me suis dit. Les requêtes multi-catégories seront très similaires, qu'il s'agisse de tags ou de catégories: sa table post2cat se décomposera en la table post2tag décrite dans l'article. –

0

Ceci est un SQL:

# Take post from castegory $cat_id 
    (SELECT P.* 
     FROM 
      posts P, post_category_relations PR 
    WHERE 
     PR.category_id = {$cat_id} AND PR.post_id = P.id 
    ) 
    UNION 
    # Take all post from $cat_id child categories 
    (SELECT P.* 
     FROM 
      posts P, post_category_relations PR, categories C 
    WHERE 
     PR.category_id = C.parent AND PR.post_id = P.id 
     AND C.id = {$cat_id} 
    ) 
+0

Ça ne marchera que pour une seule profondeur – Rifat

Questions connexes