2017-02-19 63 views
0

我有2個表 - 一個包含有關表單的元數據,另一個包含字段本身。在元數據表中,有一個選項可以選擇首先顯示哪個字段,然後在字段表中有一個排序列,顯示剩餘字段的排序。MySQL的訂單一次按字段值加入,然後通過未加入列

我需要能夠對查詢進行排序,以便首先顯示連接的元數據字段的值,然後顯示排序列。

例如:

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工作因爲使用連接,sorting_field始終爲6,因此排序好像sort_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