PHP中MySQL结果的排序输出


Sorted output of a joined MySQL result in PHP

通宵做一个项目,脑子里一片空白…真的很简单:

我有两个MySQL表,产品和类别。每种产品只属于一个类别。每个类别都有几个产品。

SELECT 
  p.uid as product_uid, p.name_NL as product_name, p.price as product_price,
  c.uid as category_uid, c.name_NL as category_name 
FROM 
  product p, category c
WHERE
  p.category_uid = c.uid

这让我对各自类别中的所有产品有了一个很好的概述。我的问题是关于在页面上输出此数据。我的目标是:

<h1>Category name</h1>
<p>Product in this category</p>
<p>Other product in this category</p>
<h1>Next category</h1>
<p>Product in next category</p>
我现在脑子里一片空白。一个人该怎么做呢?

我想避免做子查询(如果可能的话)。

亲切的问候,

添加ORDER BY category_uid以便在SQL查询中按类别排序产品如何?然后使用PHP循环遍历每个产品(行),当遇到新类别时,添加一个新标题。

例子:

<?php
// ...
$previous_category_uid = null;
// Loop through each row.
while ( $row = $result->fetch_assoc() )
{
  // If the category UID is not the same as the one from the previous row, add a header.
  if ( $previous_category_uid != $row['category_uid'] )
  {
    echo '<h1>' . $row['category_name'] . '</h1>';
    $previous_category_uid = $row['category_uid'];
  }
}

这个方法的好处是不需要嵌套查询。一个查询就足够了。

您不需要使用GROUP BY category_uid吗?

一般来说,你有两个选择:

  1. 一次获取所有数据(就像您目前正在做的那样),然后使用PHP按类别对数据进行预排序。然后在这个数组上执行输出循环。因此,1个查询,2 + n个循环(其中n是类别的数量)。
  2. 获取所有类别,然后循环输出。在每次迭代中,您都需要为该循环查询所有产品。所以1 + n个查询,1 + n个循环(这里,n是类别的数量)。

选项2可能更直接,但显然有更多的查询。最后,你说了算。

假设您正在查找每个类别中的类别名称和产品的字母顺序:

SELECT 
  p.uid as product_uid, p.name_NL as product_name, p.price as product_price,
  c.uid as category_uid, c.name_NL as category_name 
FROM product p INNER JOIN category c ON p.category_uid = c.uid
ORDER BY category_name, product_name

这也将你的查询的笛卡尔积和WHERE转换为一个内连接。

要输出您想要的标题,只需遍历返回的行,并跟踪您所在的类别。每当当前行的类别与前一行不同时,您就为新类别打印一个新的h1,并更新存储的"当前"类别。