Skip to content

Search with SubQuery

Search with subquery allows your apps to run two queries in the context of a single data retrieval request. The first query identifies a set of objects which is fed into the second query. Consider the following data schema:

users-blogpost-comment

Suppose your app needs to get all blog posts where the person who posted a comment has a specific email address (for example, @backendless.com ). Using subqueries, it can be done with the following whereClause sent to the BlogPost table:

objectId in (Comment[author.email LIKE '%@backendless.com'].blogPost.objectId)

Let's review how this whereClause is processed by Backendless:

  1. Backendless detects that the query at the top level uses the in()  operator.
  2. It checks if the contents of the in() operator have the format of a subquery and if so, evaluates it accordingly.
  3. The subquery contains an "internal whereClause", which is:
    author.email LIKE '%@backendless.com'
  4. The internal whereClause is applied to the objects in the Comment table.
  5. For all found Comment objects, Backendless gets a list of values for the blogPost.objectId column.
  6. The resulting set is fed into the in() operator which fetches the final set of objects from the BlogPost table.

General SubQuery Syntax

The general syntax for subqueries is:

searchColumnNameOrRelatedColumnName IN   
   (TableName[internalWhereClause].columnOrRelatedColumnName.optionalcolumnName)

How it works:

  1. If internalWhereClause  is present, it is executed in the table identified by TableName.
  2. In the resulting set of records, values must be selected for the column identified by
    columnOrRelatedColumnName.optionalColumnName.
  3. If internalWhereClause is not present, the contents of the IN operator have the following syntax. It represents the entire set of values identified by the specified column: TableName.columnOrRelatedColumnName.optionalColumnName
  4. The resulting set of values is used in the IN operator, thus the final query ends up being:
    searchColumnOrRelatedColumnName IN ( value1, value2,,,valueN )

Additional Examples

Consider the following data schema:

customer-order-items

  1. Get all OrderItem  objects for a customer from New York:
    objectId in (Order[customer.address = 'New York'].items.objectId)
  2. Get all Customer objects who spent more than 1.99 on an item:
    objectId in (Order[items.itemPrice > 1.99].customer.objectId)