2017-02-28 64 views
0

我有两个表格字段和内容表,看起来像这样(简化)。MySQL:按特定顺序显示每个组的第一个

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我使用的唯一的问题(5.7.12)不似乎支持在IN其中的限制。

该版本的MySQL还不支持 'LIMIT & IN/ALL/ANY/SOME 子查询'

+0

是否要检索每个field_id的最新草稿(如果不存在,发布)? – GurV

+0

这是正确的GurV –

回答

0

(分区根据field_id)与要求的顺序:

select * 
from (
select t.*, 
    @rn := if(@field_id = field_id, 
       @rn + 1, 
       if(@field_id := field_id, 1, 1) 
       ) rn 
from (
    select 
    from content 
    order by field_id, 
     field(status, 'draft', 'published'), 
     id desc 
    ) t cross join (select @rn := 0, @field_id := -1) t2 
) t where rn = 1; 
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;