2011-07-02 46 views
1

我正在使用以下未經深思熟慮的代碼塊來檢索類別及其主題。如何使這個簡單的塊更短,更好?

$query1 = "SELECT * from categories"; 

$result = mysql_query($query1); 

while ($out = mysql_fetch_assoc($result)){ 
    //category 
    print '<h2>' . $out['name'] . '</h2>'; 

    $query2 = "SELECT * from topics where fkid = $out[id]";  
    $result2 = mysql_query($query2); 

    while($top = mysql_fetch_assoc($result2)){ 
     //topic 
     print $top['name'] . '<br>'; 
    } 

} 

以上是訣竅。我知道這不是最實際的,這就是我問這個小組的原因。

我該如何改善這一點,讓它更實用,更簡單?

回答

0

只需使用一個單一查詢加入這兩個表。

$query = "SELECT categories.name AS category_name, topics.name AS topic_name 
      FROM categories JOIN topics ON categories.id = topics.fkid 
      ORDER BY categories.name ASC, topics.name ASC"; 

$resultSet = mysql_query($query); 

$currentCategory = ""; 
while ($cRecord = mysql_fetch_assoc($resultSet)) { 
    if ($currentCategory != $cRecord['category_name']) { 
     $currentCategory = $cRecord['category_name']; 
     echo "<h2>" . $currentCategory . "</h2>"; 
    } 

    echo $cRecord['topic_name'] . "<br/>"; 
} 

mysql_close($resultSet); 
+0

非常感謝你,很好地完成了,乾淨和簡單。 – Codex73

1

的一個經典案例一個JOIN:

SELECT * FROM categories JOIN topics ON categories.id = topic.fkid ORDER BY categories.name; 

然後打印,我們只能打印頭,如果它已經改變了(感謝,Rajasur!):

$catname = ""; 
while ($out = mysql_fetch_assoc($result)) 
{ 
    if ($out["name"] != $catname) // maybe need strcmp here 
    { 
    $catname = $out["name"]; 
    print($catname) 
    } 
    /* print the rest */ 
} 
+1

這將適用於SQL,但我猜OP的輸出方式是首先打印類別名稱(作爲標題),然後列出主題。像上面這樣做一個SQL會導致一些處理打印,如原始代碼片段。 – rajasaur

+0

@Rajasur:好點。好的,按'categories.name'命令,只打印第一個匹配項。讓我編輯。 –

+0

謝謝你@Kerrek – Codex73