Php 连接两个表并获取最新的slug

Php 连接两个表并获取最新的slug,php,mysql,codeigniter,codeigniter-3,slug,Php,Mysql,Codeigniter,Codeigniter 3,Slug,我有一个名为projects的表和一个名为project\u slugs的表。slug表包含给定项目的slug的所有迭代,如下所示: 在projects表中有一个字段引用slugid是没有意义的,因为一个项目可以有多个slug,因此也可以有多个ids。唯一不变的是slug表中的project\u id,它与projects表中项目的id相同 现在,当我渲染我的项目时,我想为每个项目获取最新的slug,所以我做了如下操作-我将projects表的结果作为一个对象,并使用foreach将proje

我有一个名为
projects
的表和一个名为
project\u slugs
的表。slug表包含给定项目的slug的所有迭代,如下所示:

在projects表中有一个字段引用slug
id
是没有意义的,因为一个项目可以有多个slug,因此也可以有多个
id
s。唯一不变的是slug表中的
project\u id
,它与projects表中项目的
id
相同

现在,当我渲染我的项目时,我想为每个项目获取最新的slug,所以我做了如下操作-我将
projects
表的结果作为一个对象,并使用foreach将
project\u slug
中的
slug
逐个追加

/**
 * Gets projects as defined by limit
 * Appends slugs
 * 
 * @param int $limit
 * @return array
 */
public function get_projects($limit = '')
{
    $this->db->order_by('s_order', 'DESC');
    if (!empty($limit)) {
        $this->db->limit($limit);
    }
    $query = $this->db->get_where('projects', array('published' => '1'));
    $items = $query->result();
    $this->frontend_model->add_slugs($items);
    return $items;
}
前端模块:

public function get_slug($project_id) {
    $query = $this->db->select('slug')
            ->order_by('created', 'ASC') // most recent
            ->where('project_id', $project_id)
            ->get('project_slugs')
            ->row();
    return $query->slug; // get most recent slug
}

public function add_slugs($items) {
    foreach ($items as $k => $v) {
        $v->slug = $this->frontend_model->get_slug($v->id);
    }
}
有没有一种方法可以通过连接查询来生成如下结果:?我只有在一个表与另一个表有相关字段的情况下进行联接的经验,因此这让我感到困惑。


稍微相关:我之所以有一个slug表,而不仅仅是表projects中的slug字段,是因为slug依赖于名称。如果名称更改,slug也会更改,出于搜索引擎的目的,旧slug会保留在
项目slug
表中,并重定向到新slug。

我认为您希望使用的是group\u concat。你可以要求所有的鼻涕虫分开,并与最新的在顶部排序。然后,您可以分解此项目的段塞,并根据需要使用第一个段塞或全部段塞

SELECT p.*, 
   GROUP_CONCAT(ps.slug ORDER BY ps.id DESC SEPARATOR ',') AS slugs
FROM projects p 
LEFT JOIN project_slugs ps ON ps.project_id = p.id
GROUP BY p.id

使用Xeo的查询,以及来自

我能想到这个:

SELECT p.*, 
   SUBSTRING_INDEX(GROUP_CONCAT(ps.slug ORDER BY ps.created ASC SEPARATOR ','), ',', 1) AS slugs
FROM projects p 
LEFT JOIN project_slugs ps ON ps.project_id = p.id
GROUP BY p.id
(不是世界上最美的东西,也许是子查询?

需要一个表达式。(靠近位置85处的“FROM”)。此外,正如您可能注意到的,我只是试图避免在php中执行任何附加逻辑,是否有一种方法可以从本质上获得我使用foreach开发的内容,例如,一个看起来像
slug=>某个slug值的字段。。。我只需要最新的资料,明白吗