【问题标题】:PDO Sql query with join 2 tables returns one row连接 2 个表的 PDO Sql 查询返回一行
【发布时间】:2014-07-27 21:55:02
【问题描述】:

我正在尝试制作一个下拉菜单。菜单正在从 mysql 表中获取值。 我正在使用 2 个表,第一个用于主菜单项,第二个是页面并嵌套在菜单中的父类别中。所以我的菜单必须是这样的;

<ul>
<li>MAIN MENU - 1 <!-- from menu table -->
   <ul>
       <li>SUB MENU - 1 - 1</li><!-- from sayfalar table -->
   </ul>
</li>
<li>MAIN MENU - 2 <!-- from menu table -->
   <ul>
       <li>SUB MENU - 2-1</li><!-- from sayfalar table -->
   </ul>
</li>
</ul>

我的 mysql 数据库中有 2 个表,名为:'menu'=parent 和 'sayfalar'=children。

sayfalar 表结构

sayfa_id | sayfa_foto | sayfa_ad_dil1 | sayfa_ad_dil2 | sayfa_detay_dil1 | sayfa_detay_dil2 | ust_menu_id
---------------------------------------------------------------------------------------------------------
1        | NULL       | HAKKIMIZDA    | ABOUT US      | DENEME           | LOREM IPSUM      | 2
---------------------------------------------------------------------------------------------------------

菜单表结构

menu_id | menu_ad_dil1 | menu_ad_dil2 | menu_order
--------------------------------------------------
1       | ANASAYFA     | HOMEPAGE     | 1
--------------------------------------------------
2       | KURUMSAL     | CORPORATE    | 2
--------------------------------------------------
3       | BLA BLA      | BLA BLA      | 3
--------------------------------------------------
4       | LOREM        | IPSUM        | 4
--------------------------------------------------
5       | İLETİŞİM     | CONTACT      | 5
--------------------------------------------------

使用 PDO 的 mysql 查询看起来像;

<?php
// PDO Sorgu Hazırla
$query = $db->prepare
('SELECT menu.*, sayfalar.ust_menu_id, sayfalar.sayfa_id
    FROM menu
    INNER JOIN sayfalar
ON menu.menu_id = sayfalar.ust_menu_id ORDER BY `menu`.`menu_order` ASC');
// PDO Sorguyu Çalıştır
$query->execute();
?>

并像下面一样回显;

<?php
while ($row = $query->fetch(PDO::FETCH_OBJ))
    {
    echo '<li class="pi"><a href="link.php?i='.$row->menu_id.'"><span>'.$row->menu_ad_dil2.'</span></a>';
        echo '<ul class="pi-submenu pi-has-border pi-items-have-borders pi-has-shadow pi-submenu-dark">';
            echo '<li class="pi"><a href="urun-detay.php?i='.$row->sayfa_id.'"><span>'.$row->menu_ad_dil2.'</span></a></li>';
        echo '</ul>';
    echo '</li>';
    }
?>

不幸的是,它只返回 1 行。如上所示,我的菜单表中有 5 个父菜单项。任何帮助都会非常有用。

【问题讨论】:

    标签: php mysql sql pdo inner-join


    【解决方案1】:

    试试这个

    <?php
    // PDO Sorgu Hazırla
    $query = $db->prepare
    ('SELECT distinct menu.*, sayfalar.ust_menu_id, sayfalar.sayfa_id
        FROM menu
        LEFT OUTER JOIN sayfalar
    ON menu.menu_id = sayfalar.ust_menu_id ORDER BY `menu`.`menu_order` ASC');
    // PDO Sorguyu Çalıştır
    $query->execute();
    ?>
    

    【讨论】:

    • 它工作得很好,但父菜单项显示它们彼此的子项;
    • 尝试编辑后的代码,您的原始查询的问题是内部联接中的 on 条件检查两个表的 id,并且输出只有两个表中都存在的 id。因为您的 syfalar 表只有 id 1 你只得到一个结果。左外连接返回左边表的所有行,没有条件匹配,只返回与右边表条件匹配的行。
    【解决方案2】:

    您需要检查何时在“菜单”表名称之间进行更改,因为现在您将结果中的每一行都视为其自己的父/子条目。例如你想要一些东西(伪代码):

    $previous = null;
    
    while ($row = $query->fetch(PDO::FETCH_OBJ)) {
       if ($row['menu.name'] != $previous) {
          got a "new" menu entry
          echo "<ul><li>', $row['menu.name'], '<ul>';
          $previous = $row['menu.name']; // save for next iteration
       }
       echo '<li>', $sayfalar, '</li>';
    }
    

    【讨论】:

    • 我懒得理解previous = null。如果菜单项没有子菜单,我们有一个 if 语句?
    • +1 为我展示一条了解正在发生的事情的路径:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 2013-03-03
    相关资源
    最近更新 更多