2013-06-03 44 views
4

我有3個表:videoscategoriesvideo_categories諮詢加盟查詢

videos,我有ID,標題等領域。 在categories,我有id和名字。 在video_categories中,我有id,video_id和category_id。

一個視頻可以有多個類別。所以video_categories表就是這樣的。

id video_id category_id 
1 1   1 
2 1   2 
3 1   3 

如果我想要一個視頻列表並顯示它們的類別,哪一個會是首選?

  1. 通過PHP,調用1查詢獲取所有視頻,然後循環查詢以獲取每個視頻的類別,並通過另一個查詢獲取類別名稱。如果桌子很大,這會很慢,對吧?

  2. 通過MySQL的連接(需在此幫助)。如果我將加入視頻留給video_categories,則會有同樣video_id的3個結果。我可以使用GROUP BY或SELECT DISTINCT來獲得唯一的結果,但我現在如何獲取類別的名稱?

我預期的結果將是這樣的:

id title categories 
1 Video1 pop, rock, jazz 
+0

我不認爲你的問題與非規範化,本身做的。正如您所描述的,您的模式已完全標準化,這意味着它沒有冗餘數據。你可以通過添加'categories'列到'videos'表,在其中你將存儲的類別名稱的逗號spearated字符串非規範化它(例如,「流行,搖滾,爵士」),然後用冗餘保持同步數據在'categories'和'video_categories'表中。就目前而言,您的問題實際上只是詢問如何優化您的連接技術,可以使用'group_concat'方法來完成,正如其他人所說的。 –

+0

是的,我感到困惑。我一定認爲非規範化是規範化的逆過程,它是讀取和顯示規範化的模式。我已編輯標題以避免混淆 – Henson

回答

3

對於選項2,使用GROUP_CONCAT。這將是確定

SELECT v.id, v.title, GROUP_CONCAT(c.name) 
FROM videos v 
INNER JOIN video_categories vc ON vc.video_id = v.id 
INNER JOIN categories c ON vc.category_id = c.id 
GROUP BY v.id, v.title 

對於Group_Concat()功能,是默認的分隔符。這就是爲什麼我不在這裏使用它。

+0

不知道GROUP_CONCAT。謝謝! – Henson

+0

不客氣。當我第一次聽說這個功能時,同樣的事情發生在我身上。真正有用的功能。 – sarwar026

+0

GROUP_CONCAT會在將多個結果分組在一起後將您切斷。在這裏我沒有看到它發生,但是我已經在大約第200次分組結果後停止了連接。 –

3

猜你的其他列的名字..

SELECT v.video_id, v.title, GROUP_CONCAT(c.category_name SEPARATOR ', ') 
FROM videos v 
LEFT JOIN video_categories vc ON vc.video_id = v.video_id 
LEFT JOIN categories c ON c.category_id = vc.category_id 
GROUP BY v.video_id, v.title 
+0

次要的事情 - 這是分隔符,不應該有一個'SEPARATOR'之前的逗號:'GROUP_CONCAT(c.category_name SEPARATOR',')'。 –

+0

@EdGibbs謝謝,正在輸入內存。 – Kermit

+0

如何將此語句轉換爲codeigniter? – Ambrose