2013-01-02 21 views
2

我有以下變量從我的數據庫中獲取值。這些變量存儲相同的分層列表(格式)和兒童值的分級列表的父值:MySQL/PHP/HTML如何在分層下拉菜單中插入子項?

$getSolos = $wpdb->get_results($wpdb->prepare(" 
     SELECT * FROM wp_terms p 
     LEFT OUTER JOIN wp_term_taxonomy t ON p.term_id = t.term_id 
     WHERE t.taxonomy = 'format' 
     AND t.parent = 0 
     AND t.term_id NOT IN (SELECT parent FROM wp_term_taxonomy WHERE taxonomy = 'format' AND parent > 0) 
     ORDER BY t.parent 
     ")); 

$getParents = $wpdb->get_results($wpdb->prepare(" 
     SELECT * FROM wp_terms p 
     LEFT OUTER JOIN wp_term_taxonomy t ON p.term_id = t.term_id 
     WHERE t.taxonomy = 'format' 
     AND t.parent = 0 
     AND t.term_id IN (SELECT parent FROM wp_term_taxonomy WHERE taxonomy = 'format' AND parent > 0) 
     ")); 

雖然上面不一定重要,下面是我的數據庫看起來是這樣的:

term_id name   slug     term_id1 parent 
1   Entry Form entry-form   1   0 
2   Facebook  facebook    2   0 
3   Entry Form entry-form-facebook 3   2 
4   Twitter  twitter    4   0 
5   Page   page-facebook  5   2 

所以從邏輯上講,我的對象數組包含:

$getParents->parent = 2 // contains only IDs of parent formats 
$getSolos->term_id = 1,5 // contains only IDs of formats that have no children 

的想法是來填充這些格式下拉菜單的形式,與父母格式包含他們孩子的optgroups。到目前爲止,我已經取得了以下情況:

<form> 
    Format: <select name="format"> 
     <option value="empty"></option> 
      <?php 
       foreach ($getSolos as $solo) { 
        echo "<option value='".$solo->name."' ".$selected.">".$indent.$solo->name."</option>"; 
       } 
       foreach ($getParents as $parent) { 
        echo "<optgroup label='".$parent->name."'>"; 
        // How do I get the children in here? 
        echo "</optgroup>"; 
       } 
      ?> 
    </select> 
</form> 

以上輸出:

Entry Form 
Twitter 
Facebook // Bold as it is an optgroup header 

輸出應該是:

Entry Form 
Twitter 
Facebook // Bold as it is an optgroup header 
    Entry Form 
    Page 

因此,這裏是我的問題: 1)如何做我讓孩子出現在父optgroup中?

+0

http://stackoverflow.com/ q/1519272 –

+0

我試過手動放在子查詢中,也沒有得到任何結果。 – Sweepster

回答

1

你確實可以構建一個適合NOT IN條件PHP,並將其傳遞到MySQL,比如像這樣:

$parents_sql = implode(',', array_map(intval, $getParents->parent)); 

$getSolos = $wpdb->get_results($wpdb->prepare(" 
    SELECT term_id FROM wp_term_taxonomy    
    WHERE taxonomy = 'format'   
    AND parent = 0 AND term_id NOT IN ($parents_sql) 
    ")); 

(注:intval還有什麼能讓確保此代碼不能導致SQL在你的情況下,這不應該是一個問題,但是永遠不能太確定,無論如何,這是一個很好的習慣。如果你是用字符串鍵來做這件事,你可以用適當的替換字符串引用功能爲您的數據庫。)

但是,我F時有很多的父記錄,它可能是更有效地使用子查詢(demo on SQLFiddle):

SELECT term_id FROM wp_term_taxonomy AS t1    
WHERE taxonomy = 'format'   
AND parent = 0 
AND term_id NOT IN (
    SELECT parent FROM wp_term_taxonomy   
    WHERE taxonomy = 'format'   
    AND parent > 0) 

LEFT JOINdemo on SQLFiddle):

SELECT t1.term_id 
FROM wp_term_taxonomy AS t1    
    LEFT JOIN wp_term_taxonomy AS t2 
    ON t1.term_id = t2.parent 
WHERE t1.taxonomy = 'format'   
    AND t1.parent = 0 
    AND t2.term_id IS NULL