2009-08-20 57 views
0

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

我有一个古典的数据库设计的产品类和类。

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

我想所有放入系统的层次结构像

值1

  • b_value_1
  • b_value_2

的值2

  • b_value_11
  • b_value_12

的值3

  • b_value_21
  • b_value_22
  • b_value_23

请求没有问题,但我得到这种anwser的:

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>'; 
} 

但我不喜欢太多的CATEG变量的想法,是一个字符串或ID。 有没有其他的方式来获取数据并显示它们?

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

希望你明白我想要什么。

回答

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']; 
    } 
} 
+0

你是对的,关键是id_b,但我在我的帖子中交换了表格顺序,并忘记了这一点。 该请求是隐式连接:它是一种从table_a a,table_b b中选择a.name,b.type其中a.id_a = b.id_a – Aif 2009-08-20 12:44:13

+0

我添加了一个小脚本,我没有测试它,但是结构应该是正确的。 – 2009-08-20 21:28:22

+0

是的,谢谢,这是我说的第二个解决方案(事实上它似乎我没有),但我的目标是执行这种事情,而无需对每个类别进行查询。 – Aif 2009-08-27 11:42:59

1

的例子奇科给人是在正确的轨道上,但有一个问题:当有很多类,脚本也将执行很多查询,这是低效的。下面的例子是更有效的:

$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']; 
    } 
} 

作为一个额外的好处,这也从输出更干净分离的数据的检索。

+0

感谢您的回复,但我没有发现它比我的第一个想法更好。 我想我应该保持我的第一个想法,并保持以前类别的id和当前类别id变量并进行比较。 – Aif 2009-09-16 22:19:03