我有两个表字段和内容表,看起来像这样(简化)。
fields
表
id name
1 Field One
2 Field Two
content
表
id field_id status content
1 1 draft xxx
2 1 published xxx
3 2 published xxx
唯一引人注目的事情是与字段相关联的内容有一个"草稿"对每个领域都独立的系统。
所以我检索所有字段的草稿版本,它应该带来除了字段之外的所有草稿都没有草稿版本,在这种情况下它应该返回已发布的版本。
(还有更多的州,我只是用两个来保持简单)。因此,从示例表中检索时。结果应该是这样的:
id field_id status content
1 1 draft xxx
3 2 published xxx
能达到我想要的东西是这个
SELECT * FROM contents c1 WHERE id IN (
SELECT id FROM contents c
WHERE (c.status = 'draft' OR c.status = 'published')
AND c.field_id = c1.field_id
ORDER BY FIELD(status, 'draft', 'published') LIMIT 1
);
MySQL版本I使用的唯一问题(5.7.12)似乎不支持IN
中的限制。
这个版本的MySQL还没有支持' LIMIT& IN / ALL / ANY / SOME 子查询'
答案 0 :(得分:0)
嗯。以下是一种使用聚合和max(field())
来识别适当版本的方法:
select c.*
from (select field_id, min(field(status, 'draft', 'published')) as min_field
from contents
group by field_id
) cf join
contents c
on c.field_id = cf.field_id and field(status, 'draft', 'published') = cf.min_field;
答案 1 :(得分:0)
如果您想获得最新的草稿(如果不存在,最新发布),您可以使用用户变量生成所需顺序的分区行号(基于field_id分区):
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}