MySQL通过字段值从加入然后按非连接列顺序排序

时间:2017-02-19 10:42:48

标签: mysql sql-order-by

我有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,那么它是否可以按有效排序,然后正常地按剩余的排序字段排序?

2 个答案:

答案 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