我有一个简单的问题,但我不知道应该使用哪个术语来找到答案(英语不是我的第一语言)。
我有类似产品的经典数据库设计。
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
A VALUE 2
A VALUE 3
请求并不重要,但我得到了这样的答案:
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。 有没有其他方法来获取数据并显示它们?
理想情况下,我就像一个树对象,只有一个节点用于相同的孩子。
希望你理解我想要的东西。
答案 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'];
}
}
作为额外的奖励,这也将数据的检索与输出更清晰地分开。