2012-01-27 68 views
2

我創建了一個腳本,它構建了一個包含類別,子類別和子子類別的菜單。 要獲得這些項目,我使用3個單獨的MySQL查詢。具體如下:如何優化mysql查詢獲取類別和子類

要檢索的主要類別:

SELECT id, name FROM categories WHERE parent_id=0 

要檢索的子類爲每個類別使用:

SELECT id, name FROM categories WHERE parent_id=? 

凡?是父類別的ID。 然後我再次爲每個子類別運行查詢。

如何優化此腳本以使用較少的sql查詢? 預先感謝您。

+0

你想什麼實現?如果你正在提取所有的類別,你可以選擇所有的類別,並通過將它們保存在一個數組中來將它們組織在一個樹形結構中(當你存儲一個類別時,你檢查你是否已經有一個父類的記錄,將它保存爲小孩) – mishu 2012-01-27 13:34:20

+0

真的!我們的行星裏有綠色的貓:哦,儘管你的問題+1。 – Husam 2016-01-05 12:57:54

回答

11

嘗試此查詢 -

類別+子類:

SELECT c1.id, c1.name, c2.id, c2.name FROM categories c1 
    LEFT JOIN categories c2 
    ON c2.parent_id = c1.id 
WHERE c1.parent_id = 0 

類別+子類別+副子類:

SELECT c1.id, c1.name, c2.id, c2.name, c3.id, c3.name FROM categories c1 
    LEFT JOIN categories c2 
    ON c2.parent_id = c1.id 
    LEFT JOIN categories c3 
    ON c3.parent_id = c2.id 
WHERE c1.parent_id = 0 
+0

這很好用。謝謝。 Up投票,並會盡快批准:) – 2012-01-27 13:36:29

+1

是的,這個查詢將只顯示子類別。要顯示更多級別,請再添加一個JOIN。 – Devart 2012-01-27 13:36:48

+0

如果我們不知道類別級別的數量,我們如何編寫此查詢? – anoop 2017-11-29 13:19:23

0

的選擇,如果你只想要一個類的父類(結果行計數應該等於類的數量/子行):

SELECT c1.id, c1.name, c2.id, c2.name 
    FROM category c1 
     LEFT JOIN category c2 ON c1.parent_id = c2.id