【问题标题】:PHP: Distinct categories and multiple subcategories?PHP:不同的类别和多个子类别?
【发布时间】:2015-09-25 12:18:36
【问题描述】:

我正在尝试使用 PHP 从 mysql 数据库中获取不同的类别名称并获取与每个类别名称相关的所有子类别。

所以我需要它看起来像这样:

Cat1
sub_cat1
sub_cat2
sub_cat3

Cat2
sub_cat1
sub_cat2

Cat3
sub_cat1
sub_cat2
sub_cat3
sub_cat4

这是我的代码:

$subs = "";
$header_list = "";

$sql2 ="SELECT * FROM sub_cats GROUP BY cat_name";
$query2 = mysqli_query($db_conx, $sql2);
$productCount = mysqli_num_rows($query2); // count the output amount
if ($productCount > 0) {
    while($row = mysqli_fetch_array($query2, MYSQLI_ASSOC)){ 
             $scid = $row["id"];
             $scat_name = $row["cat_name"];
             $scsub_cat_name = $row["sub_cat_name"];

             foreach ((array) $scsub_cat_name as $item) {
                 $subs .='<li>
                        <a href="printing-products/standard-business-cards-range25d3.html?productTypeId=3#?pt=3&amp;lt=1&amp;ps=57&amp;pat=4&amp;prt=1">'.$scsub_cat_name.' <i class="fa fa-angle-double-right pull-right"></i></a>
                    </li>';

                 }

             $header_list .= '<li class="product-types">
                <span class="heading">'.$scat_name.'</span>
                <ul class="product-options">
                '.$subs.'
                </ul>
            </li>';

            /*foreach ((array) $cat_name as $item) {}*/

    }
} else {
    $header_list = "";
}

echo $header_list ;

我面临的问题是它会正确地获得不同的类别,但它不会正确地获得与每个类别相关的子类别,并且会将它们放在不同的类别下!

所有类别和子类别都存储在 mysql 数据库的同一张表中,如下所示:

id   cat_name   sub_cat_name
1    cat1       subcat1
2    cat1       subcat2
3    cat1       subcat3
4    cat2       subcat1
5    cat2       subcat2

etc etc.....

有人可以就这个问题提出建议吗?

任何帮助将不胜感激。

编辑:

这就是我所做的,我在 mysql 数据库中创建了第三个表 table_cat_sub_cat

$sql2 ="SELECT catgories.cat_name, sub_cats.sub_cat_name 
FROM catgories 
INNER JOIN table_cat_sub_cat ON catgories.id=table_cat_sub_cat.cat_id 
INNER JOIN sub_cats ON table_cat_sub_cat.sub_cat_id = sub_cats.id";
$query2 = mysqli_query($db_conx, $sql2);
$productCount = mysqli_num_rows($query2); // count the output amount
if ($productCount > 0) {
    while($row = mysqli_fetch_array($query2, MYSQLI_ASSOC)){ 
             //$scid = $row["id"];
             $scat_name = $row["cat_name"];
             $scsub_cat_name = $row["sub_cat_name"];

             foreach ((array) $scsub_cat_name as $item) {
                 $subs .='<li>
                        <a href="printing-products/standard-business-cards-range25d3.html?productTypeId=3#?pt=3&amp;lt=1&amp;ps=57&amp;pat=4&amp;prt=1">'.$scsub_cat_name.' <i class="fa fa-angle-double-right pull-right"></i></a>
                    </li>';

                 }

             $header_list .= '<li class="product-types">
                <span class="heading">'.$scat_name.'</span>
                <ul class="product-options">
                '.$subs.'
                </ul>
            </li>';

但我仍然得到一些奇怪的输出,并且子类别属于不相关的类别!

【问题讨论】:

  • 如果有两张表,请分享您的结构..即加入

标签: php mysql


【解决方案1】:

您可以创建 3 个表:categoriessubcategoriesconnections。在categories 中有category_idcategory_name,在subcategories 中有subcategory_idsubcategory_name,在connections 中有connection_idcategory_idsubcategory_id。然后您可以轻松修改所有类别中的一个子类别,您可以轻松管理它们。

查询:

SELECT categories.category_name, subcategories.subcategory_name
FROM subcategories
INNER JOIN connections ON connections.subcategory_id = subcategories.subcategory_id
INNER JOIN categories ON categories.category_id = connections.category_id

编辑

不,不,没有作者。

$query= mysql_query($conn, $yourQuery);
$results = array();
while($row = mysqli_fetch_array($query, MYSQLI_ASSOC)){
    $cat_name = $row['cat_name'];
    $subcat_name = $row['sub_cat_name'];
    if(!isset($results[$cat_name])){
        $results[$cat_name] = array();
    }
    $results[$cat_name][] = $subcat_name;
}

if(!empty($results)){
    foreach($results as $category => $subcats){
        echo $category . "\n";
        foreach($subcats as $subcategory){
            echo $subcategory . "\n";
        }
    }
}

我希望它会起作用。

【讨论】:

  • 请查看我的编辑!我确实遵循了您的建议,但我仍然得到相同的结果!这是子类别在不同的类别下!此外,这些类别被重复多次,这是不受欢迎的行为!您是意外离开 GROUP BY 还是?
  • @H.HISTORY 我周末不工作,我会尽我所能帮助禁食;)
【解决方案2】:

您必须在 2 个不同的表格中将类别和子类别分开,这样许多类别才能与许多子类别相关

table_cat
id   cat_name   
1    cat1       
2    cat2
3    cat3
....

table_sub_cat
id   sub_cat_name   
1    sub_cat1       
2    sub_cat2
3    sub_cat3
....

table_cat_sub_cat
id_cat    id_sub_cat
1         1
1         3
2         1
2         2
2         3
....

那你可以

SELECT table_cat.cat_name, table_sub_cat.sub_cat_name 
FROM table_cat 
LEFT JOIN table_cat_sub_cat ON table_cat.id=table_cat_sub_cat.id_cat 
INNER JOIN table_sub_cat ON table_cat_sub_cat.id_sub_cat = table_sub_cat.id;

【讨论】:

  • 我也这样做了,我尝试加入表格但我没有运气。
  • 你试过这样吗?
  • 是的,请查看我的编辑。此外,您在查询结束时缺少一个 id。你不小心输入了 i 而不是 id。
【解决方案3】:

如果将来有人遇到同样的问题,这是正确的做法。

  $db = new mysqli('localhost', );

    if($db->connect_errno > 0){
        die('Unable to connect to database [' . $db->connect_error . ']');
    };


    // Perform queries
    $sql1 = 'select * from catgories';
    $result1 = $db->query($sql1);

    echo "<ul>";
    foreach ($result1 as $menu)
    {
         echo "<li>".$menu["cat_name"];
         echo "<ul>";
         $menu_title = $menu["cat_name"];

        $sql2 = 'SELECT
        sub_cats.sub_cat_name
        FROM
        sub_cats
        INNER JOIN catgories ON sub_cats.cat_name = catgories.cat_name
        WHERE
        catgories.cat_name = "'.$menu_title.'"';    

        $result2 = $db->query($sql2);
        foreach ($result2 as $submenu)
        {
            echo "<li>".$submenu["sub_cat_name"]."</li>";
        }
         echo "</ul>";
         echo "</li>";
    }
    echo "</ul>";


    $db->close();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-20
    • 2011-07-14
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    相关资源
    最近更新 更多