【问题标题】:MySQL 1 to many. Display only 1 result from the first tableMySQL 1 到许多。仅显示第一个表中的 1 个结果
【发布时间】:2011-05-03 15:15:23
【问题描述】:

示例代码

<?php
require_once('class_library/pdo.php');
$pdoConnection = new sdb('web_structure');
$select = $pdoConnection->query("SELECT main_menu.href AS main_href
    , main_menu.link_name AS main_link
    , sub_menu.href AS sub_href
    , sub_menu.link_name AS sub_link
  FROM main_menu
  LEFT JOIN sub_menu ON main_menu.id = sub_menu.main_menu_id 
  ORDER BY main_menu.position ASC");

while($row = $select->fetch())
{
    $href = $row["main_href"];
    $link_name = $row["main_link"];
    $sub_href = $row["sub_href"];
    $sub_link_name = $row["sub_link"];  

//MAIN MENU (display only once)
    echo "      <li><a href=\"$href\">$link_name</a>\n";

//SUB MENU (show all related results)
    echo "       <ul>\n";
    echo "        <li><a href=\"$sub_href\">$sub_link_name</a></li>\n";
    echo "       </ul>\n";
    echo "      </li>\n";
}
?>

输出

服务
- 服务 1

服务
- 服务 2 ...等

产品
- 产品 1

产品
- 产品 2 ...等


我愿意

服务
- 服务 1
- 服务 2

产品
- 产品 1
- 产品 2

【问题讨论】:

    标签: php mysql join pdo


    【解决方案1】:
    <?php
    require_once('class_library/pdo.php');
    $pdoConnection = new sdb('web_structure');
    $select = $pdoConnection->query("SELECT main_menu.href AS main_href
        , main_menu.link_name AS main_link
        , sub_menu.href AS sub_href
        , sub_menu.link_name AS sub_link
      FROM main_menu
      LEFT JOIN sub_menu ON main_menu.id = sub_menu.main_menu_id 
      ORDER BY main_menu.position ASC, main_menu.id ASC");
    
    $p_link_name = '';
    while($row = $select->fetch())
    {
        $href = $row["main_href"];
        $link_name = $row["main_link"];
        $sub_href = $row["sub_href"];
        $sub_link_name = $row["sub_link"];  
    
    //MAIN MENU (display only once)
        if ($p_link_name !== $link_name) {
            echo "      <li><a href=\"$href\">$link_name</a>\n";
        }
    
    //SUB MENU (show all related results)
        echo "       <ul>\n";
        echo "        <li><a href=\"$sub_href\">$sub_link_name</a></li>\n";
        echo "       </ul>\n";
        if ($p_link_name !== $link_name) {
             echo "      </li>\n";
        }
        $p_link_name = $link_name;
    }
    ?>
    

    【讨论】:

    • @Quassnio:最后一个echo "&lt;/li&gt;\n"; 也需要进行if 测试。
    【解决方案2】:

    你不能这样做吗?

    $select = $pdoConnection->query("
        SELECT
            main_menu.href AS main_href,
            main_menu.link_name AS main_link
        FROM
            main_menu
        ORDER BY
            main_menu.position ASC");
    
    while( $row = $select->fetch() ) {
    
        $href = $row["main_href"];
        $link_name = $row["main_link"];
    
        $subSelect = $pdoConnection->query("
            SELECT
                sub_menu.href AS sub_href,
                sub_menu.link_name AS sub_link
            FROM
                sub_menu
            WHERE
                main_menu_id = {$row['id']}");
    
        while( $subRow = $subSelect->fetch() ) {
    
            $sub_href = $subRow["sub_href"];
            $sub_link_name = $subRow["sub_link"];
        }
    
        // Output...
    }
    

    【讨论】:

    • 感谢您的输入,但是将一个 while 循环放在另一个循环中,其中包含尽可能多的菜单项,但效率非常低。
    • 是的。有时让它工作然后优化是件好事。 =)
    猜你喜欢
    • 2021-04-12
    • 2017-02-17
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多