帮助安排我的SQL数据(分类在类别中的产品)

时间:2011-02-07 20:48:13

标签: php arrays oscommerce

我想在他们的类别中显示我的所有产品,例如:

类别名称1       产品名称1,产品名称2 ... 类别名称2       产品名称3,产品名称4 ......

我正在使用oscommerce,所以数据库结构不是我的选择。我需要使用的数据库表是

products_to_categories:包含products_id和categories_id products_description:包含products_id和products_name(此表中的其他信息并不重要) category_description:包含categories_id和categories_name

我已经尝试了所有的东西,我只能将所有产品(所有在一起)和类别组合在一起,但是我不能以一种类别中所有产品都位于指定名称下的方式获得它们

正如我所说的那样,我尝试过的所有方法都简单地回应了所有类别,然后是所有产品

我真的希望你能帮忙

感谢

3 个答案:

答案 0 :(得分:1)

我完全不了解你想要展示的方式。我希望你喜欢这样显示

Category Name1 
        Product Name1
        Product Name2 
Category Name2 
        Product Name3
        Product Name4

我认为最简单的方法是在数组中获取不同的类别列表。 与猫id和猫的名字 循环该阵列并打印每个类别的产品。

如果类别列表很大,将其存储在数组中并且循环将是一个坏主意。

答案 1 :(得分:1)

有两种方法可以解决这个问题,背后的想法已经作为答案提供给Zod。

第一种方法是使用category_description获取所有类别(无论是否包含产品),第二种方法是仅提取使用的类别(即,未获取完整的列表)类别)。我将通过第一种方式;得到所有类别。

运行category_description,并将ID和类别名称转换为数组。

现在,使用foreach运行该数组,并从products_to_categories中获取所有product_ids。 (SELECT products_id FROM products_to_categories WHERE categories_id=[CATEGORY ID GOES HERE])。

现在您拥有与并发类别关联的产品ID,您可以运行products_description并获取其名称。基本上,您的代码应如下所示:

foreach ($categories as $category) {
   ...display category name and run code to get product ids...
   foreach ($products as $product) {
       ...get product name from products_description...
       ...display product name...
   }
}

答案 2 :(得分:0)

您可能需要在SQL中使用LEFT JOIN,将三个表合并在一起,然后按category_name, product_name对查询进行排序。

类似的东西:

SELECT p.product_id, p.product_name, c.category_name FROM `products_description` p
LEFT JOIN `products_to_categories` linker ON linker.product_id=p.product_id
LEFT JOIN `category_description` c ON linker.category_id=c.category_id
ORDER BY c.category_name, p.product_name

然后你的PHP输出列表将是这样的:

$data = array(); // Data from query above
$cur_category = '';
foreach($data as $product) {
  if ($product['category_name'] != $cur_category) {
    // Category changed; display it
    echo $product['category_name'].": ";
    $cur_category = $product['category_name'];
  }
  echo $product['product_name'].", ";
}