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中,您可以使用extendedhaving
子句。将中的替换为:
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给我空结果集后,即使slugstar-management-week-2015
存在:你的slug没有提到最长日期..(项目的最新slug)你的问题似乎不连贯…尝试避免slug匹配,检查所有项目的结果..没关系,gordon的答案有效。谢谢你的帮助!