MYSQL:不是在while循环中使用SELECT语句 - 我的选择是什么?

Ash*_*Ash 2 php mysql select nested while-loop

我有一个包含类别列表的表,另一个表包含每个类别中的产品列表.

例如

CatID | Cat_Name
----------------
1     | Books
2     | CDs
Run Code Online (Sandbox Code Playgroud)

ProductID | Product_Name     | CatID
------------------------------------
1         |The Bible         | 1
2         |The Koran         | 1
3         |90s Greatest Hits | 2
4         |80s Greatest Hits | 2
Run Code Online (Sandbox Code Playgroud)

我想做的就是得到

<ul>
<li>Books</li>
   <ul>
   <li>The Bible</li>
   <li>The Koran</li>
   </ul>
<li>Cds</li>
   <ul>
   <li>90s Greatest Hits </li>
   <li>00s Greatest Hits </li>
   </ul>
 </ul>
Run Code Online (Sandbox Code Playgroud)

没做(PHP)

$query = mysql_query("SELECT ... FROM categories")

while($row = mysql_fetch_assoc($query)):

$query2 = mysql_query("SELECT ... FROM products WHERE catId = $row['CatId'])

endwhile;
Run Code Online (Sandbox Code Playgroud)

如何摆脱使用嵌套的while/SELECT语句,我可以使用一个查询高效地完成 - 以及如何使用PHP访问相关数据?

编辑:我的印象是,如果你的表变得非常大,多个SQL查询会使页面变慢,因此为了优化页面加载,你应该尝试减少查询次数?

use*_*291 6

使用JOIN选择所有产品和类别名称

select * from category c, products p where c.catID = p.catID order by p.catID
Run Code Online (Sandbox Code Playgroud)

获取和分组结果

$products_by_cat = array();
foreach(fetch(....) as $record)
    $products_by_cat[$record->catName][] = $record;
Run Code Online (Sandbox Code Playgroud)

你会得到一个二维数组

 [books] => array(bible, koran)
 [CDs]   => array(cd1, cd2, ....)
Run Code Online (Sandbox Code Playgroud)

输出此数组有两个嵌套循环

 foreach($products_by_cat as $cat => $products)
    <li> $cat  <ul>
    foreach($products as $p)
        <li> $p->name </li>
    </li></ul>
Run Code Online (Sandbox Code Playgroud)