MySQL:显示特定订单中每个组的第一个

时间:2017-02-28 19:52:04

标签: mysql sql mariadb

我有两个表字段和内容表,看起来像这样(简化)。

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   子查询'

2 个答案:

答案 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();
    }
}