Mysql 查询联接获取,将最近创建的字段添加到行

Mysql 查询联接获取,将最近创建的字段添加到行,mysql,sql,Mysql,Sql,我很难回答一个问题 我有一个名为project\u slug的表,其中包含以下字段id,project\u id,slug,created 我有一个包含各种字段的主表projects 通过projects.id和project\u slugs.project\u id存在外键关系 project\u slug可以包含任意给定项目的多个slug 我希望得到一个结果,其中包含项目表中的所有字段,以及该给定项目最近创建的项目.slug。这应该通过WHERE projects\u slug.slug='

我很难回答一个问题

我有一个名为
project\u slug
的表,其中包含以下字段
id,project\u id,slug,created

我有一个包含各种字段的主表
projects

通过
projects.id
project\u slugs.project\u id
存在外键关系

project\u slug
可以包含任意给定项目的多个slug

我希望得到一个结果,其中包含
项目
表中的所有字段,以及该给定项目最近创建的
项目.slug
。这应该通过
WHERE projects\u 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'
鼻涕虫:

项目:

带输入的预期输出:

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'


预期输出将是您在最后一张图像中看到的+由
project\u slugs.created
确定的最新
slug
值。给定任何
项目\u slug.slug
(新的或旧的)作为标识符。我甚至不确定这在sql中是否可行。在php中,逻辑相当简单。

您还应该将连接与max created group by project\u 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 

我想你想要的是任何有问题的项目的最新进展。如果是:

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'
             );
如果您实际上只想要最近的slug是指定slug的项目,那么在MySQL中,您可以使用extended
having
子句。将
中的
替换为:

having most_recent_slug = 'some-slug'

因为没有timestamp字段,也没有date_created,所以我假设最近创建的slug是最后插入的ID,假设,“ORDER BY slug.id DESC LIMIT 1”应该可以。project_slug.created
对应于最新的slug。我很困惑你说你想要最新创建的slug,然后“这应该通过WHERE完成”这两条语句相互矛盾。你能详细说明你的意思吗。添加示例数据和预期输出(作为文本)会有所帮助。我想您需要做的是根据传递的slug值查找项目id,然后查找项目id的最新创建日期,然后加入项目。看看这个。我已注释掉where子句,因为我对您可能希望将其放回的所有项目感兴趣。您可能希望也可能不希望左加入。@P.Salmon您应该将其添加为答案!那我就可以投你一票了。您的解决方案也很有效,尽管我更喜欢公认的答案,因为它更容易理解,我也不太详细。上面的代码有一个问题:
#1054-where子句中的未知列“p.project_id”
编辑:我在您的答案中解决了这个问题,它可以工作;
p.project\u id
的问题应该是
p.id
。我还喜欢我如何简单地删除
存在的地方
,并使用它来获取所有行及其各自最近的slug。非常感谢你!答案已更新。。缺少连接词。。Inner给我空结果集后,即使slug
star-management-week-2015
存在:你的slug没有提到最长日期..(项目的最新slug)你的问题似乎不连贯…尝试避免slug匹配,检查所有项目的结果..没关系,gordon的答案有效。谢谢你的帮助!