2017-02-19 5 views
0

私は2つのテーブルを持っています - 1つはフォームに関するメタデータを含み、もう1つはフィールド自体を含んでいます。メタデータテーブルには、どのフィールドが最初に表示されるかを選択するオプションがあり、フィールドテーブル内に残りのフィールドの順序を表示する順序欄があります。MySQLは、結合からのフィールド値で1回、次に結合されていない列で

クエリを並べ替えることができるようにする必要があります。これにより、結合されたメタデータフィールドの値が最初に表示され、次に順序付けされた列が表示されるようになります。例えば

forms 
id sort_field 
1 6 
2 0 

form_fields 
id  form_id  name  ordering 
1  2   field1 1 
2  2   field2 3 
3  2   field3 2 
4  1   fielda 3 
5  1   fieldd 2 
6  1   fieldc 4 
7  1   fieldb 1 

私の現在のクエリは次のとおりです。

select ff.name 
from form_fields ff 
    left join forms f on ff.form_id=f.id 
order by f.sort_field DESC, ff.ordering ASC 

それはフォーム内の任意の並べ替えを持っていないので、これはフォーム2のために働く - それは、フォーム1のために動作しません。 joinを使用すると、sorting_fieldは常に6なので、sorting_fieldに値がないかのようにソートされます。

フォーム1のための私の所望の出力は次のようになります。

fieldc 
fieldb 
fieldd 
fielda 

、それが設定されている場合は、一度効果でsort_fieldでソートすることができ、その後、通常のように、残りの注文分野で?

答えて

1

new_orderフィールドを設定することができます。

select name 
from 
    (select ff.name 
      case when id = f.sort_field then 0 else ff.ordering end new_order 
     from form_fields ff 
      left join forms f on ff.form_id=f.id 
    ) t 
order by t.new_order 
1

あなたは例えば、UNIONクエリを使用してそれを行うことができます。:

(SELECT name, 0 as ordering 
FROM form 
WHERE id = (SELECT sort_field FROM form_fields where id = 1) 
AND form_id = 1) 

UNION 

(SELECT name, ordering 
FROM form 
WHERE form_id = 1 
AND id != (SELECT sort_field FROM form_fields where id = 1)) 
ORDER BY ordering 

ここSQL Fiddleです。

+0

あなたの最初のデータが逆転しました(フォームのフィールドはフォームフィールドにあってはならず、その逆もあります)ので、変更する必要がありますが、 – bhttoan

関連する問題