2012-10-11 42 views
-2

可能重複:
SELECT and list children and parent選擇和列表的孩子和家長 - 替代

我收到xception這樣的回答:

https://stackoverflow.com/a/12770593/445820

不幸的是,GROUP_CONCAT ISN」對我來說,解決方案是另一個問題太延長了,所以我重新提出這個問題。

我需要一個替代查詢與子查詢。由於我的查詢不夠好,這項任務也超出了我的能力。

請幫忙。

下面是代碼:

// Prepare query 
$columns = "c.rule_id, c.rule_title, GROUP_CONCAT(r.rule_description ORDER BY r.rule_position ASC SEPARATOR '~sep~') AS rule_desc, "; 
$columns .= "GROUP_CONCAT(r.parse_bbcode ORDER BY r.rule_position ASC SEPARATOR '~sep~') AS bbcode, "; 
$columns .= "GROUP_CONCAT(r.parse_links ORDER BY r.rule_position ASC SEPARATOR '~sep~') AS links, "; 
$columns .= "GROUP_CONCAT(r.parse_smilies ORDER BY r.rule_position ASC SEPARATOR '~sep~') AS smilies"; 

$sql_array = array(
    'SELECT' => $columns, 
    'FROM'  => array(RULES_TABLE => 'c'), 
    'LEFT_JOIN' => array(
     array(
      'FROM' => array(RULES_TABLE => 'r'), 
      'ON' => 'r.parent_id = c.rule_id', 
     ), 
    ), 
    'WHERE'  => 'c.parent_id = 0 AND r.public = 1', 
    'GROUP_BY' => 'c.rule_id', 
    'ORDER_BY' => 'c.cat_position', 
); 

$sql = $db->sql_build_query('SELECT', $sql_array); 
$result = $db->sql_query($sql); 

$cat_count  = 1; 
$alpha_count = 'abcdefghijklmnopqrstuvwxyz'; 

while ($row = $db->sql_fetchrow($result)) 
{ 
    $template->assign_block_vars('rules', array(
     'RULE_CATEGORY' => $row['rule_title'], 
     'ROW_COUNT'  => $cat_count, 
    )); 

    $rules_ary  = explode('~sep~', $row['rule_desc']); 
    $parse_bbcode = explode('~sep~', $row['bbcode']); 
    $parse_links = explode('~sep~', $row['links']); 
    $parse_smilies = explode('~sep~', $row['smilies']); 
    $counter  = 0; 

    foreach ($rules_ary as $key => $rule) 
    { 
     $uid = $bitfield = $options = ''; 
     generate_text_for_storage($rule, $uid, $bitfield, $options, $parse_bbcode[$key], $parse_links[$key], $parse_smilies[$key]); 

     $template->assign_block_vars('rules.rule', array(
      'RULE_DESC'  => generate_text_for_display($rule, $uid, $bitfield, $options), 
      'ALPHA_COUNT' => $alpha_count{$counter}, 
     )); 

     $counter++; 
    } 

    $cat_count++; 
} 
$db->sql_freeresult($result); 

一些功能可能是您不知道的。僅供參考,這是phpBB相關的代碼。

對不起,第一次沒有添加代碼。

+0

爲什麼'group_concat'不適合你的解決方案? –

+0

即使沒有代碼,也不會打擾,我特別要求它。我問你發佈你的SQL和PHP代碼,如果你想任何幫助。 – xception

+0

升級到本地遞歸查詢的DBMS。 –

回答

1
// Prepare query 
$columns = "c.rule_id, c.rule_title, r.rule_description AS rule_desc, "; 
$columns .= "r.parse_bbcode AS bbcode, "; 
$columns .= "r.parse_links AS links, "; 
$columns .= "r.parse_smilies AS smilies"; 

$sql_array = array(
    'SELECT' => $columns, 
    'FROM'  => array(RULES_TABLE => 'c'), 
    'LEFT_JOIN' => array(
     array(
      'FROM' => array(RULES_TABLE => 'r'), 
      'ON' => 'r.parent_id = c.rule_id', 
     ), 
    ), 
    'WHERE'  => 'c.parent_id = 0 AND r.public = 1', 
    'ORDER_BY' => 'c.cat_position', 
); 

$sql = $db->sql_build_query('SELECT', $sql_array); 
$result = $db->sql_query($sql); 

$cat_count  = 0; 
$alpha_count = 'abcdefghijklmnopqrstuvwxyz'; 

$prev_rule_id = 0; 
$r_rule_titles = array(); 

$rule_id = null; 

while ($row = $db->sql_fetchrow($result)) 
{ 
    if($rule_id != $row['rule_id']) { 
      $rule_id = $row['rule_id']; 
     $cat_count++; 
     $counter = 0; 
     $template->assign_block_vars('rules', array(
      'RULE_CATEGORY' => $row['rule_title'], 
      'ROW_COUNT'  => $cat_count, 
     )); 
    } 
    $uid = $bitfield = $options = ''; 
    generate_text_for_storage($row['rule_desc'], $uid, $bitfield, $options, $row['bbcode'], $row['links'], $row['smilies']); 

    $template->assign_block_vars('rules.rule', array(
     'RULE_DESC'  => generate_text_for_display($row['rule_desc'], $uid, $bitfield, $options), 
     'ALPHA_COUNT' => $alpha_count{$counter}, 
    )); 

    $counter++;  
} 
$db->sql_freeresult($result); 
+0

此代碼只是在沒有控制權的情況下轉儲數據,並通過它擁有的規則數(子)重複相同的類別名稱。 – Aborted

+0

編輯,真的忘了在if中的任務,現在再試一次,認真你應該已經想出了自己雖然。 – xception

+0

好吧,在發表評論之前,沒有很好的看過它。儘管它現在可行,但你的解決方案讓我很困惑。謝謝。 – Aborted