gpt4 book ai didi

php - mysql一对多返回,分页处理

转载 作者:行者123 更新时间:2023-11-29 00:26:19 26 4
gpt4 key购买 nike

所以我有以下(缩写的)表格:

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 个结果,但是因为有单个资源的多个结果,当我压缩它时我得到 2实际资源而不是 10 个。有什么建议吗?

我试图远离以下代码:

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

最佳答案

你的问题的答案是你需要一个稳定的排序。显式添加一个 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;

关于php - mysql一对多返回,分页处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18748774/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com