2010-06-29 99 views
1

我正試圖對這些字段進行多對多的查詢。我想獲得:那是在一個類別如何查詢多對多

2是在一個類別

1)所有的職位)凡在後

3的類別)中的所有職位,有一個特定ID

posts 
+-------------+--------------+ 
| id   | int(11)  | 
| title  | varchar(255) | 
| body  | text   | 
| parent_id | int(11)  | 
| category_id | int(11)  | 
+-------------+--------------+ 
    post_categories 
+----------+--------------+ 
| id  | int(11)  | 
| category | varchar(255) | 
+----------+--------------+ 
    post_category_bridge 
+-------------+-------------+ 
| id   | int(11)  | 
| post_id  | int(11) | 
| category_id | int(11) | 
+-------------+-------------+ 

有一兩件事我很擔心的是,我在使用PHP的一個MySQL數據庫的發展PDO,但我會在網站轉移到對發射當天的SQL服務器。我知道MySQL和SQL Server有區別。 POD會處理這些差異,還是需要重新編寫這些查詢。

在此先感謝。

+1

爲什麼你將'post.id'作爲'int(11)'而將'post_category_bridge.post_id'作爲'tinyint(11)'?這是創建外鍵常見的東西嗎? – 2010-06-29 00:51:11

+1

您不需要在帖子表上使用您的category_id。這應該是你的「橋樑」或關係表的目的。 – Freddy 2010-06-29 01:23:58

回答

3

我使用詳細連接語法來更清楚地瞭解表如何關聯。

1)凡在給定的類別名稱類別

的職位,你需要加入所有三個表。

select p.* 
    from post_category c 
    join post_category_bridge b on c.id = b.category_id 
    join posts p    on p.id = b.post_id 
    where c.category = ? 

2)凡在後

考慮的帖子ID的類別,你只需要加入的橋樑和類別表。

select c.* 
    from post_category_bridge b 
    join post_category c  on c.id = b.category_id 
    where b.post_id = ? 

3)凡在具有特定ID

我想你的意思是category.id這裏(相對於category.name),它類似於查找職位類別的職位(1 ),但不需要加入類別表,因爲您已經知道該ID;你只需要加入橋樑和張貼表格。

select p.* 
    from post_category_bridge b 
    join posts     on p.id = b.post_id 
    where b.category_id = ? 

我會的現場轉移到對發射當天的SQL服務器... ...將POD照顧這些差異或將我需要重新編寫這些查詢。

這取決於最終在您的系統中的查詢。如果你正在編寫自己的SQL,那麼如果你在開發過程中使用MySQL特有的特性或語法,那麼這很重要。我強烈推薦在SQL Server 上測試,發佈日期早於,否則您可能會推遲一段時間推遲發佈。您可以爲此目的下載免費的evaluation version。在這值得重複的評論中提到

點:

  • @freddy提到,你不需要posts.category_id領域。在多對多關係中,橋樑(又名'junction','join','map','link'等)表將鏈接鏈接到多個類別 - 如果只有,則將使用posts表上的單個字段一個類別被允許。
  • as @JamieWong提到,你應該保持表鍵與外鍵之間的類型一致,例如,如果posts.idint(11),則post_category_bridge.post_id也應該是int(11)。執行外鍵約束的大多數(所有?)數據庫都需要這個(包括MySQL)。爲什麼?如果可以有4294967295個帖子(如4字節int所支持的),那麼只有支持鏈接到255個帖子的橋表中沒有什麼意義(如1字節tinyint所支持)
  • 雖然你可能會......以及將ID(和這些ID的FK)unsigned
0

這有幫助嗎?

1:

select p.* from posts p, post_categories c 
where p.category_id=c.id and category='something' 

2:

select c.* from post_categories, posts p 
where p.category_id=c.id and post_id=something 

3:

select p.* from post_categories, posts p 
where p.category_id=c.id and post_id=something and category='something' 
0

select a.* from posts a, post_categories b, post_category_bridge c 
WHERE 
    b.category="mycat" AND 
    b.id=c.category_id AND 
    a.id = c.post_id; 

select b.category from posts a, post_categories b, post_category_bridge c, 
WHERE 
    c.post_id='PostID' AND 
    b.id = c.category_id; 


select a.* from posts a, post_categories b, post_category_bridge c 
WHERE 
    b.category="mycat" AND 
    c.category_id = b.id AND 
    c.post_id = 'MyID' AND 
    a.id = c.post_id;