Query join get, добавьте недавно созданное поле в строку - PullRequest
0 голосов
/ 05 мая 2019

У меня трудное время с запросом.

У меня есть таблица с именем project_slugs, которая содержит следующие поля id, project_id, slug, created.

У меня есть основная таблица projects содержит различные поля.

Существует отношение внешнего ключа через projects.id, и project_slugs.project_id.

project_slugs может содержать несколько слагов для любого данного проекта.

Я хочу получить один результат, который имеет все поля из таблицы projects плюс самое последнее созданное projects_slug.slug для данного проекта.Это должно быть достигнуто WHERE projects_slug.slug = 'some-slug', где 'some-slug' может быть или не быть самым последним slug.

Я могу успешно присоединиться к таблицам, однако я не уверен, как включить жирную логику выше.

Вот мой текущий запрос:

SELECT projects.*, project_slugs.slug 
FROM `project_slugs` LEFT JOIN 
     `projects`
     ON project_slugs.project_id = projects.id
WHERE project_slugs.slug = 'some-slug'

Слагы:

projects slugs

Проекты:

projects

Ожидаемый выход с входом:

SELECT projects.*, project_slugs.slug
FROM `project_slugs` LEFT JOIN 
     `projects`
     ON project_slugs.project_id = projects.id
WHERE project_slugs.slug = 'star-management-week-2015'

enter image description here

Ожидаемый выход будетбыть тем, что вы видите на последнем изображении + значение самое последнее slug, которое обведено кружком в соответствии с project_slugs.created.Дано любой project_slugs.slug (новый или старый) в качестве идентификатора.Я даже не уверен, возможно ли это в sql.Логика довольно проста в php.

Ответы [ 2 ]

1 голос
/ 05 мая 2019

Я думаю, что вам нужен самый последний слаг для любого проекта, в котором есть этот слаг. Если так:

select p.*,
       (select ps.slug
        from project_slugs ps
        where ps.project_id = p.id
        order by ps.created desc
        limit 1
       ) as most_recent_slug
from projects p
where exists (select 1
              from project_slugs ps
              where ps.project_id = p.id and
                    ps.slug = 'some-slug'
             );

Если вам действительно нужны только проекты, где самым последним слагом является указанный слаг, то в MySQL вы можете использовать расширенное предложение having. Заменить where на:

having most_recent_slug = 'some-slug'
1 голос
/ 05 мая 2019

Вы также должны использовать объединение с подзапросом для максимально созданной группы по project_id

SELECT projects.*, 
project_slugs.slug 
FROM projects 
inner join  (
  select project_id, max(created) max_created 
  from  project_slugs 
  group by  project_id 
) t on t.project_id = projects.id 
inner join  `project_slugs` ON project_slugs.project_id = projects.id 
AND project_slugs.created = t.max_created 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...