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

Posted

技术标签:

【中文标题】加入两个表并获取最新的 slug【英文标题】:Join two tables and get most recent slug 【发布时间】:2018-06-26 21:42:56 【问题描述】:

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

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

现在,当我渲染我的项目时,我想为每个项目获取最新的 slug,所以我做了这样的事情 - 我将 projects 表的结果作为对象并附加 slug 来自 project_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 表而不仅仅是一个 slug 字段的原因是 slug 取决于名称。如果名称更改,则 slug 也会更改,并且出于搜索引擎的目的,旧 slug 将保留在 project_slugs 表中并重定向到新 slug。

【问题讨论】:

见meta.***.com/questions/333952/… 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

我认为您想要使用的是 group_concat。您可以要求所有以 分隔的 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

【讨论】:

需要一个表达式。 (在位置 85 的“FROM”附近)。此外,正如您可能注意到的那样,我只是试图避免在 php 中执行任何额外的逻辑,有没有一种方法可以从本质上获取我正在使用我的 foreach 开发的内容,例如一个看起来像slug=>some-slug-value 的字段? pastebin.com/W5r3zR8f ...我只需要最新的 slug

以上是关于加入两个表并获取最新的 slug的主要内容,如果未能解决你的问题,请参考以下文章

通过 linq 对实体查询进行分组,以通过加入表来获取具有最新时间戳的一条记录

加入两个表日期并获取每个项目的最新日期[关闭]

mysql查询加入,比较两个表并返回第一个表中的所有记录

如何基于 ManyToManyField 内部连接表并按参数分组并在 Django 中获取最新的表?

加入一个包含桥表的表并从主表中获取数据,如果数据存在于桥表中,那么也可以获取它

如何连接两个 XML 表并嵌套而不重复