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

zed5wv10  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(377)

我有张table叫 projects 还有一张table叫 project_slugs . slug表包含给定项目的slug的所有迭代,如下所示:

在projects表中有一个字段引用slug是没有意义的 id 因为一个项目可以有多个slug,因此 id s。唯一不变的是 project_id 在Slug表中,与 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;
}

前端型号:

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? 我只有在一个表与另一个表有相关字段的情况下进行连接的经验,所以这让我很困惑。
稍微相关:我之所以有一个slug表,而不仅仅是表projects中的slug字段,是因为slug依赖于名称。如果名称发生了变化,slug也会发生变化,出于搜索引擎的目的,旧slug会保存在 project_slugs 表并重定向到新的slug。

xwmevbvl

xwmevbvl1#

使用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

(也许不是世界上最美的东西?)

oyjwcjzk

oyjwcjzk2#

我想你想和一群人一起工作。你可以要求所有的鼻涕虫分开,并与最近在顶部订购。然后,您可以为这个项目分解slug,并根据需要使用第一个或全部slug。

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

相关问题