簡體   English   中英

即使ID匹配,SQL INNER JOIN也僅從第二個表中選擇最后一行

[英]SQL INNER JOIN selects only one, last row from second table even if id matches

如何從第二個表中按ID選擇所有行? 目前,如果id匹配,它將僅從第二個表中選擇最后一行。

查詢:

SELECT

categories.category_id,
categories.category_name,
subcategories.subcategory_name,
categories.category_data,
categories.category_icon

FROM categories INNER JOIN subcategories ON

subcategories.category_id=categories.category_id";

完整代碼:

public static function getAllCategories()
{
    $database = DatabaseFactory::getFactory()->getConnection();

    $sql = "
    SELECT c.category_id
         , c.category_name
         , s.subcategory_name
         , c.category_data
         , c.category_icon 
      FROM categories c
      JOIN subcategories s 
        ON s.category_id = c.category_id;
     ";

    $query = $database->prepare($sql);
    $query->execute();

    $all_categories = array();

    foreach ($query->fetchAll() as $category) {

        array_walk_recursive($category, 'Filter::XSSFilter');

        $all_categories[$category->category_id] = new stdClass();
        $all_categories[$category->category_id]->category_id = $category->category_id;
        $all_categories[$category->category_id]->category_data = $category->category_data;
        $all_categories[$category->category_id]->category_icon = $category->category_icon;
        $all_categories[$category->category_id]->category_name = $category->category_name;
        $all_categories[$category->category_id]->subcategory_name = $category->subcategory_name;
    }

    return $all_categories;
}

相片:

這是我應該得到的:

在此處輸入圖片說明

這就是我所擁有的:

在此處輸入圖片說明

第一個表正確選擇所有行,但是如果id匹配,第二個表僅選擇最后一行。 如何從第二張表中選擇所有行?

問題出在您的PHP中。 每次循環時,都當前行中的數據替換 $allCategories[$category->category_id] 因此,循環完成后,它僅包含最后一行的數據。

您應該制作一個多維數組。 當一行包含與上一行相同的類別時,將新對象推入數組。

foreach ($query->fetchAll() as $category) {

    array_walk_recursive($category, 'Filter::XSSFilter');

    if (!isset($allCategories[$category->category_id])) {
        $allCategories[$category->category_id] = array();
    }
    $all_categories[$category->category_id][] = $category;
}

無需創建新的stdClass對象並復制每個屬性,因為fetchAll為每一行返回一個新對象。 您可以將該對象放入數組中。

查詢:

SELECT

categories.category_id,
categories.category_name,
subcategories.subcategory_id,
subcategories.subcategory_name,
categories.category_data,
categories.category_icon

FROM categories INNER JOIN subcategories ON

subcategories.category_id=categories.category_id";

編輯

$subCat = array();
foreach ($query->fetchAll() as $category) {

     array_walk_recursive($category, 'Filter::XSSFilter');

     $subCat[$category->category_id][] = $category->subcategory_name;

     $all_categories[$category->category_id] = new stdClass();
     $all_categories[$category->category_id] = $category;
     $all_categories[$category->category_id]->subcategory_name = (object) $subCat[$category->category_id];
}

在獲取數據時:

<?php foreach ($this->categories as $category) { ?>
    <?= $category->category_data; ?>
    <?php foreach ($category->subcategory_name as $subcategory) { ?>
        <?= $subcategory; ?>
    <?php } ?>
<?php } ?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM