2017-02-28 19 views
0

私はこのような(2つの)テーブルと2つのテーブルを持っています。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 

だけキャッチーな事は、フィールドに関連するコンテンツは、各フィールドのための独立である「ドラフト」のシステムを持っていることです。

私はすべてのフィールドのドラフトバージョンを取得するので、ドラフトバージョンを持たないフィールド以外のすべてのドラフトを持っていなければなりません。

(もっと多くの州がありますが、私はそれを単純に保つために2つだけ使用しています)。したがって、サンプル表から検索するとき。私が欲しいものを達成するであろう何かが私が使用しているMySQLのバージョン(5.7.12)がないことだけの問題では、この

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 
); 

ある

id field_id status  content 
1 1   draft  xxx 
3 2   published xxx 

:結果はこのようなものでなければなりませんは、INの制限をサポートしているようです。

のMySQLのこのバージョンはまだ

+0

field_idごとに最新の下書き(存在しない場合は公開済み)を取得しますか? – GurV

+0

これは正しいGurVです –

答えて

0

はあなたが最新のドラフト(もし存在しない、最新の公表)を取得したい場合は、分割された行番号を生成するために、ユーザー変数を使用することができます(分割

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

うーん '& IN/ALL/ANY/SOME はサブクエリLIMIT' をサポートしていません。ここでは、適切なバージョンを識別するための集約と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; 
関連する問題