2011-05-20 52 views
5

我想了解MySQL的入門文章,所以我創建了一個小博客系統。MySQL的:從分類

我在MySQL 3個表:

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 

每一個職位可以有多個類別,他們的關係存儲在post_category_relations:

所以,當我訪問的index.php類= 10,我想獲得每一個職位是什麼關係category10包括來自其職位子文件夾category12也是如此。

我未完成的片段在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); 

我知道,這將需要先進的MySQL技能,但任何幫助表示讚賞!我已經在PHP做這個,但我需要使用4個環,其是不這樣做,當它在MySQL的最好的方式,我只是不知道如何還:)

+1

首先,如果你要逃脫你獲取輸入你做一個查詢之前(以防止SQL注入) 這樣的: $ folder_id = $ _GET [ 「類別」]; 應該是: $ folder_id = mysql_real_escape_string(的stripslashes($ _ GET [ 「類別」])); – Tim 2011-05-20 06:11:52

+0

我也建議你閱讀@Denis提供的文章。你會學到很多:)我自己多次閱讀。 – Rifat 2011-05-20 06:49:50

+0

使用MySQL會話變量:http://explainextended.com/2009/09/29/adjacency-list-vs-nested-sets-mysql/。另請參閱此問題的其他選項:http://stackoverflow.com/questions/4048151/what-are-the-options-for-storing-hierarchical-data-in-a-relational-database – orangepips 2011-05-23 19:07:19

回答

0

我不在的位置測試我的查詢,但我相信像

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=?) 

是你在找什麼。

+0

它只適用於一個深度 – Rifat 2011-05-20 06:48:11

+0

@Rifat,在問題中提到這些類別不在單深度樹中?引用,'所以當我訪問index.php?category = 10時,我想要得到每個帖子與category10相關的內容,包括來自其子文件夾category12的帖子。「 – amal 2011-05-20 06:55:55

+0

表本身的結構是多層次的嗎? – Rifat 2011-05-20 06:57:31

4

你可能會發現由菲利普·凱勒這些文章有趣:

,涵蓋標籤,但你的查詢(即category1 and category2 VS category1 or category2,和一個你'正在努力寫作)將幾乎完全相同。

又見索引分層數據的討論:Managing Hierarchical Data in MySQL

除了線程上,使得相關的嵌套集合,標籤,分類衆人等

+0

標籤不能在這種情況下使用,只有樹(帶路徑,我假設)。所以+1等級鏈接,但你可以寫更詳細的答案。 – 2011-05-20 06:44:06

+1

是的,我想。不過,多類別查詢將非常相似,無論它們是標記還是類別:他的post2cat表將分解到文章中討論的post2tag表。 – 2011-05-20 06:48:00

0

這是一個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

它只能用於單一深度 – Rifat 2011-05-20 06:52:39