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    |
+--------+-----------------+------+--------+--------------+