加入两个表并获得最新的slug

时间:2018-01-17 22:04:47

标签: php mysql codeigniter codeigniter-3 slug

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

enter image description here

在项目表中引用一个slug id的字段没有意义(我看到)因为一个项目可以有多个slug,因此有多个id s。唯一不变的是slugs表中的project_id与项目表中项目的id相同。

现在当我渲染我的项目时,我希望获得每个项目最新的slug,所以我做了类似的事情 - 我将projects表的结果作为对象并附加slugproject_slugs一个接一个地使用foreach。

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

Frontend_model:

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

有没有办法使用连接查询来开发一个看起来像https://pastebin.com/W5r3zR8f的结果?我只有做一个连接的经验,其中一个表与另一个表有一个相关的字段,所以这让我很难过。

略有关联:我有一个slugs表而不仅仅是表项目中的slug字段的原因是slug取决于名称。如果名称发生变化,那么slug和搜索引擎的目的是将旧的slug保存在project_slugs表中并重定向到新的slug。

2 个答案:

答案 0 :(得分:1)

我认为您想要使用的是group_concat。你可以要求所有被分隔的slu and,并在最顶层订购。那么你可以爆炸这个项目的slu and并根据需要使用第一个或全部。

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

答案 1 :(得分:0)

使用Xeo的查询,以及https://jainishsenjaliya.wordpress.com/2013/01/12/how-to-hack-mysql-group-concat-to-fetch-a-limited-number-of-rows/

的一些帮助

我能够想出这个:

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

(不是世界上最美丽的东西,也许是子查询?)