2014-01-05 21 views
0

我有一個數據庫結構,這樣MySQL查詢到從給定父的子類別

CATEGORIES 
ID | parent_id | name 
1 | 0   | sports 
2 | 1   | football 
3 | 1   | tennis 
4 | 0   | activities 
5 | 4   | hiking 
etc. 


NEWS 
ID | category_id | title    | date  | etc 
1 | 2   | Football is great | 2012-12-21 | 
2 | 3   | Tennis is healthy | 2012-11-13 | 
3 | 5   | Go on hiking  | 2013-11-15 | 

現在,當我想獲得「體育」的子類別的頭條新聞(標題)頭條新聞,什麼是實現這一目標的最佳方式

我正在考慮做多個查詢(在這種情況下是3)。

首先,獲得「體育」的所有孩子的

SELECT * FROM categories WHERE parent_id = 1 

然後,對於每個結果做一個查詢來獲取每個子類別的頭條新聞。

SELECT * FROM news WHERE category_id = (result from query above) 

在此示例中,將執行3個查詢。 (一個獲得所有子類別,在這種情況下有兩個子類別,因此兩個查詢將被執行到新聞表格中,總共有3個)。

或者是否有更智能(更高效)的方式來執行這個?也許1個查詢?

+0

您可以輕鬆地加入這兩個表。 CATEGORIES和NEWS之間的關係如何?它是1:1還是1:n?沒有新聞的類別是否有效? –

+0

請注意,按照慣例,我們對孤兒使用NULL而不是0。 – Strawberry

回答

1

你應該使用INNER JOIN

SELECT NEWS.*, CATEGORIES.name 
FROM NEWS 
INNER JOIN CATEGORIES ON NEWS.category_id = CATEGORIES.ID 

您也可以使用LEFT JOIN編寫查詢可以使用一個查詢做到這一點。這將允許您列出所有類別,包括沒有新聞報道的類別。

SELECT categories.name as Category_Name, news.* 
FROM categories 
LEFT JOIN news ON news.category_id = categories.ID 

我已經把這個在SQL小提琴,以幫助證明:http://sqlfiddle.com/#!2/9c1b3/6

+0

非常感謝你! – SunAmonRa