Присоединяйтесь к двум столам и получите самый последний слизень

0

У меня есть таблица под названием projects и таблица под названием project_slugs. Таблица слизней содержит все итерации пули для данного проекта и выглядит следующим образом:

Изображение 174551

Нет смысла (я вижу) иметь поле в таблице проектов, ссылающееся на id slug, потому что проект может иметь несколько слизней и, следовательно, несколько id. Единственной вещью, которая является постоянной, является project_id в таблице slugs, которая совпадает с 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;
}

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? У меня только есть опыт выполнения объединений, где одна таблица имеет связанную область с другой, так что это меня озадачило.

Немного связаны: причина, по которой у меня есть таблица для пули, а не только поле слива в проектах таблицы, заключается в том, что пул зависит от имени. Если имя изменяется так же, как и slug и для целей поисковой системы, старый слизень хранится в таблице project_slugs и перенаправляется на новый пул.

Теги:
codeigniter
codeigniter-3
slug

2 ответа

1

Я думаю, что вы хотите работать с 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
  • 0
    Выражение было ожидаемым. (рядом с "ОТ" в позиции 85). Кроме того, как вы можете заметить, я просто пытаюсь избежать выполнения какой-либо дополнительной логики в php, есть ли способ, по сути, просто получить то, что я разрабатываю с моим foreach, например поле, похожее на slug=>some-slug-value ? pastebin.com/W5r3zR8f ... Мне просто нужен самый последний слизень
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

(не самая красивая вещь в мире, может быть, подзапросы?)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню