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:
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:
- Backendless detects that the query at the top level uses the
in()
operator. - It checks if the contents of the
in()
operator have the format of a subquery and if so, evaluates it accordingly. - The subquery contains an "internal whereClause", which is:
author.email LIKE '%@backendless.com'
- The internal whereClause is applied to the objects in the
Comment
table. - For all found
Comment
objects, Backendless gets a list of values for the blogPost.objectId column. - The resulting set is fed into the
in()
operator which fetches the final set of objects from theBlogPost
table.
General SubQuery Syntax¶
The general syntax for subqueries is:
searchColumnNameOrRelatedColumnName IN
(TableName[internalWhereClause].columnOrRelatedColumnName.optionalcolumnName)
How it works:
- If
internalWhereClause
is present, it is executed in the table identified byTableName
. - In the resulting set of records, values must be selected for the column identified by
columnOrRelatedColumnName.optionalColumnName
. - If
internalWhereClause
is not present, the contents of theIN
operator have the following syntax. It represents the entire set of values identified by the specified column:TableName.columnOrRelatedColumnName.optionalColumnName
- 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:
- Get all
OrderItem
objects for a customer fromNew York
:objectId in (Order[customer.address = 'New York'].items.objectId)
- Get all
Customer
objects who spent more than1.99
on an item:objectId in (Order[items.itemPrice > 1.99].customer.objectId)