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

php - 加入两个表并获得最新的子弹-LMLPHP

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

现在,当我渲染项目时,我想获取每个项目的最新信息,所以我要做类似的事情-我将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?我只有一个表具有与另一个表相关的字段的联接经验,所以这让我感到很困惑。

稍微相关:我有一个表来表示表项,而不仅仅是表项目中的表项字段,原因在于表项取决于名称。如果名称更改,则该段标记也会更改,并且出于搜索引擎的目的,旧段标记将保留在project_slugs表中,并重定向到新段标记。

最佳答案

我认为您要使用的是group_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

关于php - 加入两个表并获得最新的子弹,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48310778/

10-12 17:09