Postgres: Sort query results

The order_by argument

Results from your query can be sorted by using the order_by argument. The argument can be used to sort nested objects too.

The sort order (ascending vs. descending) is set by specifying the asc or desc enum value for the column name in the order_by input object, e.g. {name: desc}.

By default, for ascending ordering null values are returned at the end of the results and for descending ordering null values are returned at the start of the results. null values can be fetched first on ascending ordering by specifying asc_nulls_first and last on descending ordering by specifying desc_nulls_last enum value e.g. {name: desc_nulls_last}.

The order_by argument takes an array of objects to allow sorting by multiple columns.

You can also use nested objects’ fields to sort the results. Only columns from object relationships and aggregates from array relationships can be used for sorting.

You can see the complete specification of the order_by argument in the API reference.

The following are example queries for different sorting use cases:

Sorting objects

Example: Fetch a list of authors sorted by their names in an ascending order:

query {
  authors (
    order_by: {name: asc}
  ) {
    id
    name
  }
}
query { authors ( order_by: {name: asc} ) { id name } }
{ "data": { "authors": [ { "id": 5, "name": "Amii" }, { "id": 4, "name": "Anjela" }, { "id": 8, "name": "April" }, { "id": 2, "name": "Beltran" }, { "id": 7, "name": "Berti" }, { "id": 6, "name": "Corny" } ] } }

Sorting nested objects

Example: Fetch a list of authors sorted by their names with a list of their articles that is sorted by their rating:

query {
  authors (order_by: {name: asc}) {
    id
    name
    articles(order_by: {rating: desc}) {
      id
      title
      rating
    }
  }
}
query { authors (order_by: {name: asc}) { id name articles(order_by: {rating: desc}) { id title rating } } }
{ "data": { "authors": [ { "id": 5, "name": "Amii", "articles": [ { "rating": 5, "id": 17, "title": "montes nascetur ridiculus" }, { "rating": 3, "id": 12, "title": "volutpat quam pede" }, { "rating": 2, "id": 4, "title": "vestibulum ac est" } ] }, { "id": 4, "name": "Anjela", "articles": [ { "rating": 4, "id": 3, "title": "amet justo morbi" }, { "rating": 1, "id": 1, "title": "sit amet" } ] }, { "id": 8, "name": "April", "articles": [ { "rating": 4, "id": 13, "title": "vulputate elementum" }, { "rating": 2, "id": 20, "title": "eu nibh" } ] } ] } }

Sorting based on nested object’s fields

Only columns from object relationships and aggregates from array relationships can be used for sorting.

For object relationships

For object relationships only columns can be used for sorting.

Example: Fetch a list of articles that are sorted by their author’s ids in descending order:

query {
  articles (
    order_by: {author: {id: desc}}
  ) {
    id
    rating
    published_on
    author {
      id
      name
    }
  }
}
query { articles ( order_by: {author: {id: desc}} ) { id rating published_on author { id name } } }
{ "data": { "articles": [ { "id": 3, "title": "Article 3", "content": "Sample article content 3", "author": { "id": 2, "name": "Author 2" } }, { "id": 1, "title": "Article 1", "content": "Sample article content 1", "author": { "id": 1, "name": "Author 1" } }, { "id": 2, "title": "Article 2", "content": "Sample article content 2", "author": { "id": 1, "name": "Author 1" } } ] } }

For array relationships

For array relationships only aggregates can be used for sorting.

Example: Fetch a list of authors sorted in descending order of their article count:

query {
  authors (
    order_by: {
      articles_aggregate: {count: desc}
    }
  ) {
    id
    name
    articles_aggregate {
      aggregate{
        count
      }
    }
  }
}
query { authors ( order_by: { articles_aggregate: {count: desc} } ) { id name articles_aggregate { aggregate{ count } } } }
{ "data": { "authors": [ { "id": 5, "name": "Amii", "articles_aggregate":{ "aggregate": { "count": 3 } } }, { "id": 4, "name": "Anjela", "articles_aggregate":{ "aggregate": { "count": 2 } } }, { "id": 8, "name": "April", "articles_aggregate":{ "aggregate": { "count": 2 } } } ] } }

Example: Fetch a list of authors sorted in increasing order of their highest article rating:

query {
  authors(
    order_by: {
      articles_aggregate: {
        max: {rating: asc_nulls_last}
      }
    }
  ) {
    id
    name
    articles_aggregate {
      aggregate{
        max {rating}
      }
    }
  }
}
query { authors( order_by: { articles_aggregate: { max: {rating: asc_nulls_last} } } ) { id name articles_aggregate { aggregate{ max {rating} } } } }
{ "data": { "authors": [ { "id": 7, "name": "Berti", "articles_aggregate": { "aggregate": { "max": { "rating": 2 } } } }, { "id": 2, "name": "Beltran", "articles_aggregate": { "aggregate": { "max": { "rating": 3 } } } }, { "id": 8, "name": "April", "articles_aggregate": { "aggregate": { "max": { "rating": 4 } } } }, { "id": 3, "name": "Sidney", "articles_aggregate": { "aggregate": { "max": { "rating": 4 } } } }, { "id": 5, "name": "Amii", "articles_aggregate": { "aggregate": { "max": { "rating": 5 } } } }, { "id": 9, "name": "Ninnetta", "articles_aggregate": { "aggregate": { "max": { "rating": null } } } } ] } }

Sorting based on computed fields

Only scalar computed fields and aggregates of table computed fields can be used for sorting.

For scalar computed fields

Scalar computed fields can be used for sorting just like columns.

Example: Computed field total_marks is defined on student table which calculates the sum of marks obtained in each subject. Fetch a list of students sorted by their total marks:

query {
  student(order_by: {total_marks: desc}){
    id
    name
    total_marks
    physics
    chemistry
    maths
  }
}
query { student(order_by: {total_marks: desc}){ id name total_marks physics chemistry maths } }
{ "data": { "student": [ { "id": 2, "name": "Bob", "total_marks": 60, "physics": 21, "chemistry": 22, "maths": 17 }, { "id": 1, "name": "Alice", "total_marks": 59, "physics": 23, "chemistry": 22, "maths": 14 } ] } }

For table computed fields

Aggregates of table being returned by table computed fields can be used for sorting.

Example: Computed field get_articles is defined to author table returns list of articles. Fetch a list of authors sorted by their articles count.

query{
  author(order_by: {get_articles_aggregate: {count: desc}}){
    id
    name
    get_articles{
      id
      title
      content
    }
  }
}
query{ author(order_by: {get_articles_aggregate: {count: desc}}){ id name get_articles{ id title content } } }
{ "data": { "author": [ { "id": 1, "name": "Author 1", "get_articles": [ { "id": 1, "title": "Article 1", "content": "Sample article content 1" } ] }, { "id": 2, "name": "Author 2", "get_articles": [] } ] } }

Note

Only computed fields whose associated SQL function with no input arguments other than table row and hasura session arguments are supported in order by.

Supported from

Ordering by computed fields is supported from version v2.0.2 and above

Sorting by multiple fields

Example: Fetch a list of articles that is sorted by their rating (descending) and then on their published date (ascending with nulls first):

query {
  articles (
    order_by: [
      {rating: desc},
      {published_on: asc_nulls_first}
    ]
  ) {
    id
    rating
    published_on
  }
}
query { articles ( order_by: [ {rating: desc}, {published_on: asc_nulls_first} ] ) { id rating published_on } }
{ "data": { "articles": [ { "id": 17, "rating": 5, "published_on": null }, { "id": 14, "rating": 4, "published_on": null }, { "id": 7, "rating": 4, "published_on": "2016-07-09" }, { "id": 3, "rating": 4, "published_on": "2017-05-26" } ] } }