Php 使用嵌套while循环不提供所需的输出
我试图做的是创建一个从数据库中提取的类别列表,然后在每个类别下面列出 相关的子类别 到目前为止,我得到了:Php 使用嵌套while循环不提供所需的输出,php,mysql,pdo,Php,Mysql,Pdo,我试图做的是创建一个从数据库中提取的类别列表,然后在每个类别下面列出 相关的子类别 到目前为止,我得到了: <?php // this query lets us know that we are looking for matches that equal 2, which points to the subject of vehicles. // from this query i am able to list all categories that are relevan
<?php
// this query lets us know that we are looking for matches that equal 2, which points to the subject of vehicles.
// from this query i am able to list all categories that are relevant to vehicles.
$getCategoriesQuery = $db->query("SELECT * FROM item_cat WHERE sub_id = '2'"); //2 = vehicles
?>
<?php
while($row = $getCategoriesQuery->fetch()){
echo '<ul>'.$row['category'].'';
}
?>
现在,当我将以下while循环添加到上面的循环时:
<?php
while($row = $getCategoriesQuery->fetch()){
echo '<ul>'.$row['category'].'';
// this has been added to try and get the sub categories
$getSubCatQuery = $db->query("SELECT * FROM item_cat, item_sub_cat
WHERE item_cat.cat_id = item_sub_cat.cat_id "); // cat_id
while($row = $getSubCatQuery->fetch()){
echo '<li><a href="vehicles.php?p='.$row['sub_category'].'" >'.$row['sub_category'].'</a></li>';
}
echo '</ul>';
}
?>
当我想做的是:
-motor vehicles
- cars
- motorbikes
- buses
- trucks
-railed vehicles
- trains
-aircraft
- planes
我一开始就尝试加入查询,但没有乐趣,所以我分成两个查询,以尝试更好地了解情况。
我已在第二个while循环中将“$row”更改为“$row2”,但这会导致“row2['sub_category]”的索引错误未定义
我还尝试使用“foreach循环”而不是第二个“while循环”:
我曾尝试在查询中添加“限制1”和“分组依据”,但这样每个类别只显示1个项目
- motor vehicles
- cars
- railed vehicles
- trains
内部
while
循环正在重新分配$row
数组变量。将其更改为其他名称,例如$sub_row
内部查询也不会因外部查询的值而改变,因此每次执行的方式完全相同。使用类似
SELECT*FROM item_sub_cat,其中item_sub_cat.cat_id=$row[“category_id”]
内部查询将允许结果依赖于外部查询的每个结果
编辑:注意不要在查询中包含输出方面不需要的表。仅当您需要对两个表执行联接时才包括它们。我不知道这是否有用,但我认为您应该能够使用联接一次性获取所有相关记录
select * from `item_cat` c
right join `item_sub_cat` sc on sc.`cat_id`=c.`cat_id`
where c.`sub_id` = '2'
create table if not exists `item_cat` (
`cat_id` smallint(5) unsigned not null auto_increment,
`category` varchar(50) default null,
primary key (`cat_id`)
) engine=innodb auto_increment=4 default charset=utf8;
insert into `item_cat` (`cat_id`, `category`) values
(1, 'aircraft'),
(2, 'railed vehicles'),
(3, 'motor vehicles');
+--------+-----------------+
| cat_id | category |
+--------+-----------------+
| 1 | aircraft |
| 2 | railed vehicles |
| 3 | motor vehicles |
+--------+-----------------+
create table if not exists `item_sub_cat` (
`scid` smallint(5) unsigned not null auto_increment,
`cat_id` smallint(5) unsigned not null,
`sub_category` varchar(50) not null,
primary key (`scid`),
key `cat_id` (`cat_id`),
constraint `fk_cat_subcat` foreign key (`cat_id`) references `item_cat` (`cat_id`) on delete cascade on update cascade
) engine=innodb auto_increment=10 default charset=utf8;
insert into `item_sub_cat` (`scid`, `cat_id`, `sub_category`) values
(1, 3, 'car'),
(2, 3, 'motorbike'),
(3, 3, 'buses'),
(4, 3, 'truck'),
(5, 2, 'train'),
(6, 2, 'wagon'),
(7, 1, 'helicopter'),
(8, 1, 'plane'),
(9, 1, 'microlite');
+------+--------+--------------+
| scid | cat_id | sub_category |
+------+--------+--------------+
| 1 | 3 | car |
| 2 | 3 | motorbike |
| 3 | 3 | buses |
| 4 | 3 | truck |
| 5 | 2 | train |
| 6 | 2 | wagon |
| 7 | 1 | helicopter |
| 8 | 1 | plane |
| 9 | 1 | microlite |
+------+--------+--------------+
select * from item_cat c
right join item_sub_cat sc on sc.cat_id=c.cat_id;
+--------+-----------------+------+--------+--------------+
| cat_id | category | scid | cat_id | sub_category |
+--------+-----------------+------+--------+--------------+
| 3 | motor vehicles | 1 | 3 | car |
| 3 | motor vehicles | 2 | 3 | motorbike |
| 3 | motor vehicles | 3 | 3 | buses |
| 3 | motor vehicles | 4 | 3 | truck |
| 2 | railed vehicles | 5 | 2 | train |
| 2 | railed vehicles | 6 | 2 | wagon |
| 1 | aircraft | 7 | 1 | helicopter |
| 1 | aircraft | 8 | 1 | plane |
| 1 | aircraft | 9 | 1 | microlite |
+--------+-----------------+------+--------+--------------+
从上面的记录集可以相对容易地生成您想要的html布局,尽管我可能没有抓住重点。我将内部的“$row”更改为“$sub_row”,这在现在查看时很有意义。然后,按照您的建议将内部查询更改为:
code
$getSubCatQuery=$db->query(“从item_sub_cat,item_cat,其中item_sub_cat.cat_id='””。$row['cat_id']。“”<代码>代码将子类别置于正确的类别下。。。但是,它们正在重复x5(我在相关数据库中的总行数)。我在查询中设置了一个限制,但这并没有解决问题。好的,首先不需要结束连接,您可以编写:$getSubCatQuery=$db->query(“选择*FROM item_sub_cat,item_cat WHERE item_sub_cat.cat_id=”。$row['cat_id')代码>。你的意思是每个主要类别下的子类别都重复了五次吗?是的,我在飞机和有轨车辆上添加了一些其他子类别,看看它是否还会增加,但它只是将所有内容重复了五次-编辑-再次查看,5来自我,类别数据库中有5个类别。您是否尝试从查询中删除item\u cat
?因此,查询现在将读取$getSubCatQuery=$db->query(“选择*FROM item_sub_cat WHERE item_sub_cat.cat_id=“.$row['cat_id'))代码>认为可能是这样;没问题。:-)您应该使用分组依据
而不是限制
,这应该检索结果。
<?php
// this query lets us know that we are looking for matches that equal 2, which points to vehicles.
$getCategoriesQuery = $db->query("SELECT * FROM item_cat WHERE sub_id = '2'"); //vehicles
?>
<?php
while($row = $getCategoriesQuery->fetch()){
echo '<ul>'.$row['category'].'';
$getSubCatQuery = $db->query("SELECT * FROM item_cat, item_sub_cat
WHERE item_cat.cat_id = item_sub_cat.cat_id "); // cat_id
foreach ($getSubCatQuery->fetchAll () as $row2) {
echo '<li><a href="vehicles.php?p='.$row2['sub_category'].'" >'.$row2['sub_category'].'</a></li>';
}
echo '</ul>';
}
?>
<?php
while($row = $getCategoriesQuery->fetch()){
echo '<ul>'.$row['category'].'';
$getSubCatQuery = $db->query("SELECT * FROM item_sub_cat, item_cat WHERE item_sub_cat.cat_id ='".$row['cat_id']."' ");
while($sub_row = $getSubCatQuery->fetch()){
echo '<li><a href="vehicles.php?p='.$sub_row['sub_category'].'" >'.$sub_row['sub_category'].'</a></li>';
}
echo '</ul>';
}
?>
- motor vehicles
- cars
- motorcycles
- trucks
- buses
- cars
- motorcycles
- trucks
- buses
- cars
- motorcycles
- trucks
- buses
- cars
- motorcycles
- trucks
- buses
- cars
- motorcycles
- trucks
- buses
- railed vehicles
- trains
- trains
- trains
- trains
- trains
- motor vehicles
- cars
- railed vehicles
- trains
select * from `item_cat` c
right join `item_sub_cat` sc on sc.`cat_id`=c.`cat_id`
where c.`sub_id` = '2'
create table if not exists `item_cat` (
`cat_id` smallint(5) unsigned not null auto_increment,
`category` varchar(50) default null,
primary key (`cat_id`)
) engine=innodb auto_increment=4 default charset=utf8;
insert into `item_cat` (`cat_id`, `category`) values
(1, 'aircraft'),
(2, 'railed vehicles'),
(3, 'motor vehicles');
+--------+-----------------+
| cat_id | category |
+--------+-----------------+
| 1 | aircraft |
| 2 | railed vehicles |
| 3 | motor vehicles |
+--------+-----------------+
create table if not exists `item_sub_cat` (
`scid` smallint(5) unsigned not null auto_increment,
`cat_id` smallint(5) unsigned not null,
`sub_category` varchar(50) not null,
primary key (`scid`),
key `cat_id` (`cat_id`),
constraint `fk_cat_subcat` foreign key (`cat_id`) references `item_cat` (`cat_id`) on delete cascade on update cascade
) engine=innodb auto_increment=10 default charset=utf8;
insert into `item_sub_cat` (`scid`, `cat_id`, `sub_category`) values
(1, 3, 'car'),
(2, 3, 'motorbike'),
(3, 3, 'buses'),
(4, 3, 'truck'),
(5, 2, 'train'),
(6, 2, 'wagon'),
(7, 1, 'helicopter'),
(8, 1, 'plane'),
(9, 1, 'microlite');
+------+--------+--------------+
| scid | cat_id | sub_category |
+------+--------+--------------+
| 1 | 3 | car |
| 2 | 3 | motorbike |
| 3 | 3 | buses |
| 4 | 3 | truck |
| 5 | 2 | train |
| 6 | 2 | wagon |
| 7 | 1 | helicopter |
| 8 | 1 | plane |
| 9 | 1 | microlite |
+------+--------+--------------+
select * from item_cat c
right join item_sub_cat sc on sc.cat_id=c.cat_id;
+--------+-----------------+------+--------+--------------+
| cat_id | category | scid | cat_id | sub_category |
+--------+-----------------+------+--------+--------------+
| 3 | motor vehicles | 1 | 3 | car |
| 3 | motor vehicles | 2 | 3 | motorbike |
| 3 | motor vehicles | 3 | 3 | buses |
| 3 | motor vehicles | 4 | 3 | truck |
| 2 | railed vehicles | 5 | 2 | train |
| 2 | railed vehicles | 6 | 2 | wagon |
| 1 | aircraft | 7 | 1 | helicopter |
| 1 | aircraft | 8 | 1 | plane |
| 1 | aircraft | 9 | 1 | microlite |
+--------+-----------------+------+--------+--------------+