简体   繁体   English

即使ID匹配,SQL INNER JOIN也仅从第二个表中选择最后一行

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

How to select all rows by id from second table? 如何从第二个表中按ID选择所有行? At the moment it selects only last row from second table if id matches. 目前,如果id匹配,它将仅从第二个表中选择最后一行。

Query: 查询:

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";

Full code: 完整代码:

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;
}

Photos: 相片:

This is what I should get: 这是我应该得到的:

在此处输入图片说明

And this is what I have: 这就是我所拥有的:

在此处输入图片说明

First table properly selects all rows, but second table selects only last row if id matches. 第一个表正确选择所有行,但是如果id匹配,第二个表仅选择最后一行。 How to select all rows from second table? 如何从第二张表中选择所有行?

The problem is in your PHP. 问题出在您的PHP中。 Each time through the loop you replace $allCategories[$category->category_id] with the data from the current row. 每次循环时,都当前行中的数据替换 $allCategories[$category->category_id] So when the loop is done, it only contains the data from the last row. 因此,循环完成后,它仅包含最后一行的数据。

You should make a multidimensional array. 您应该制作一个多维数组。 When a row contains the same category as a previous row, push the new object onto the array. 当一行包含与上一行相同的类别时,将新对象推入数组。

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;
}

There's no need to make a new stdClass object and copy each property, since fetchAll returns a new object for each row. 无需创建新的stdClass对象并复制每个属性,因为fetchAll为每一行返回一个新对象。 You can just put that object into the array. 您可以将该对象放入数组中。

Query: 查询:

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";

EDIT 编辑

$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];
}

While getting the data: 在获取数据时:

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