У меня есть таблица под названием projects
и таблица под названием project_slugs
. Таблица слизней содержит все итерации пули для данного проекта и выглядит следующим образом:
Нет смысла (я вижу) иметь поле в таблице проектов, ссылающееся на 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
и перенаправляется на новый пул.
Я думаю, что вы хотите работать с 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
slug=>some-slug-value
? pastebin.com/W5r3zR8f ... Мне просто нужен самый последний слизень
Используя запрос 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
(не самая красивая вещь в мире, может быть, подзапросы?)