我有2个表 - 一个包含有关表单的元数据,另一个包含字段本身。在元数据表中,有一个选项可以选择首先显示哪个字段,然后在字段表中有一个排序列,显示剩余字段的排序。
我需要能够对查询进行排序,以便首先显示已加入的元数据字段的值,然后显示排序列。
例如:
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,因此它排序就像没有值一样在sorting_field。
表单1的我想要的输出是:
fieldc
fieldb
fieldd
fielda
如果设置了sort_field,那么它是否可以按有效排序,然后正常地按剩余的排序字段排序?
答案 0 :(得分: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 :(得分: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 。