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

时间:2015-10-15 18:59:00

标签: php mysql select join

如何从第二个表中按ID选择所有行?目前,如果id匹配,它只从第二个表中选择最后一行。

查询:

IdentifierName

完整代码:

ReservedWord

照片:

这是我应该得到的:

enter image description here

这就是我所拥有的:

enter image description here

第一个表正确选择所有行,但如果id匹配,则第二个表仅选择最后一行。如何从第二个表中选择所有行?

2 个答案:

答案 0 :(得分:1)

问题在于你的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对象并复制每个属性。您可以将该对象放入数组中。

答案 1 :(得分:1)

<强>查询:

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