产品类别

时间:2009-08-20 09:43:05

标签: php mysql database

我有一个简单的问题,但我不知道应该使用哪个术语来找到答案(英语不是我的第一语言)。

我有类似产品的经典数据库设计。

CREATE TABLE IF NOT EXISTS `a` (
  `id_a` int(11) NOT NULL auto_increment,
  `type` varchar(255) NOT NULL,
  PRIMARY KEY  (`id_a`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ;

CREATE TABLE IF NOT EXISTS `b` (
  `id_b` int(11) NOT NULL,
  `id_a` int(11) NOT NULL,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY  (`id_b`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

其中b.id_a是a.id_a的外键

我希望获得所有类似

的层次结构

A VALUE 1

  • b_value_1
  • b_value_2

A VALUE 2

  • b_value_11
  • b_value_12

A VALUE 3

  • b_value_21
  • b_value_22
  • b_value_23

请求并不重要,但我得到了这样的答案:

VALUEOF-TABLE-A | VALUEOF-TABLE-B
A VALUE 1       | b_value_1
A VALUE 1       | b_value_2

等等。

我目前的代码如下:

$categ = '';
while ($row = mysql_fetch_row ($ressource))
{
   if ($row['VALUEOF-TABLE-A']!=$categ) 
   { 
     $categ = $row['VALUEOF-TABLE-A']; 
     echo '<h3>', $categ, '</h3>';
   }
   echo '<h4>', $row['VALUEOF-TABLE-B'], '</h4>';
}

但我不太喜欢categories变量的想法,无论是字符串还是id。 有没有其他方法来获取数据并显示它们?

理想情况下,我就像一个树对象,只有一个节点用于相同的孩子。

希望你理解我想要的东西。

2 个答案:

答案 0 :(得分:1)

在Mysql中使用外键时,应该使用InnoDB引擎而不是MyISAM。

b表的构思似乎存在问题,id_b应该是主键,而不是id_a

要解决您的问题,您可能应首先检索id_a列表,然后通过id_a发出一个选择请求,以使用id_b选择相应的JOIN

编辑:脚本应该看起来像这样一点:

$category_array = mysql_query("SELECT id_a, type FROM a");
while ($category = mysql_fetch_array($category_array))
{
    echo $category['type'];
    $product_array = mysql_query("SELECT * FROM b WHERE id_a = $id_a");
    while ($product = mysql_fetch_array($product_array))
    {
         echo $product['name'];
    }
}

答案 1 :(得分:1)

Chico提供的示例是在正确的轨道上,但有一个问题:当有许多类别时,脚本也会执行许多查询,这是低效的。以下示例更有效:

$categories = array();
$category_array = mysql_query("SELECT id_a, type FROM a");
while ($category = mysql_fetch_array($category_array))
{
    $category['products'] = array();
    $categories[$category['id_a']][] = $category;
}

$product_array = mysql_query("SELECT * FROM b");
while ($product = mysql_fetch_array($product_array))
{
    $categories[$product['id_a']]['products'][] = $product
}

foreach($categories as $category) {
    echo $category['type'];
    foreach ($category['products'] as $product) {
         echo $product['name'];
    }
}

作为额外的奖励,这也将数据的检索与输出更清晰地分开。