1

したがって、次の(省略された)表があります。

resource
id | name

resource_category
resource_id | category_id

category
id | name

リソースと割り当てられたすべてのカテゴリを取得する場合は、次の SQL を使用します。

SELECT resource.id. resource.name, category.id, category.name FROM resource
LEFT JOIN resource_category ON resource_category.resource_id = resource.id
LEFT JOIN category ON category.id = resource_category.category_id

これにより、次のリソースが取得されます

resource.name1 | 1 | category1
resource.name1 | 2 | category2
resource.name1 | 5 | category5
resource.name2 | 5 | category5
resource.name2 | 6 | category6
resource.name2 | 1 | category1

次に、結果をループして配列に圧縮していました

foreach( $results as $result ) {
    $resources[$result['id']]['resource'] = $result;
    $resources[$result['id']]['categories'][$result['category_id']] =
    $result['category_name'];
}

次に、リソースとそのすべてのカテゴリがあります。

私が直面している問題は、ページネーションを開始して LIMIT を使用すると、結果が 10 個の結果になることですが、1 つのリソースに対して複数の結果があるため、圧縮すると 10 個ではなく 2 個の実際のリソースが得られます。 ?

私は以下のコードから離れようとしていました:

foreach( $results as $result ) {
      $resources[$result['id']]['resource'] = $result;
      $resources[$result['id']]['categories'] =
      $this->resource_model->get_categories( $result['id'] );
}
4

1 に答える 1

1

あなたの質問への答えは、安定した並べ替えが必要だということです。明示的に追加order by:

SELECT resource.id. resource.name, category.id, category.name
FROM resource
LEFT JOIN resource_category ON resource_category.resource_id = resource.id
LEFT JOIN category ON category.id = resource_category.category_id
order by resource.id, category.id;

これらを配列に入れるだけの場合は、次を試してくださいgroup_concat()

SELECT resource.id. resource.name,
       group_concat(category.id) as cids,
       group_concat(category.name) as cnames
FROM resource
LEFT JOIN resource_category ON resource_category.resource_id = resource.id
LEFT JOIN category ON category.id = resource_category.category_id
group by resource.id;
于 2013-09-11T18:59:19.333 に答える