Durdin
01/09/2024, 8:52 AMmax on a select with Exposed Kotlin. I wanna do something like
SELECT user_id, group_id, max(version)
FROM users
GROUP BY group_id;
In this case i want to get those version_id with the max version inside the same groupId. I dont achieve the query to work because i dont get properly the subQuery builder by using a groupBy. Atm my where clause looks like:
UserTable.slice(UserTable.id, UserTable.versionGroupID, UserTable.version.max())
.selectAll()
.groupBy(UserTable.versionGroupID)
Based on previous comments on the channel it should be something like this. However i get all time the subquery has too many columns or field must be contained on GROUP BY or used on an expression
using the kotlin Exposed DSL atm. Appreciate if someone more into the use of the sdk could give me a hand! Thanks alot!Chantal Loncle
01/10/2024, 12:26 AMmax() correctly and the DSL query generates the SQL that you mentioned wanting above.
From the database POV, the query you want is invalid because it doesn't follow the rules of a SELECT statement with a GROUP BY clause.
As explained by the exceptions you're seeing, some databases (like SQL Server, PostgreSQL, Oracle, and MySQL) have the following rule:
• All selected columns must either be in the GROUP BY clause, be an aggregate column, or somehow be functionally dependent on the column in the GROUP BY clause.
If you're using MySQL, I believe that this rule can be loosened by disabling the mode only_full_group_by or, for example, by ensuring that versionGroupID has a unique column index (if id is the primary key). Here's the MySQL official reference that covers your options.
If you're using another database, there are different queries that can be used to workaround this SQL restriction, but the best option for your use case will be dependent on the specific database.
Please consider either checking the official database reference for GROUP BY guidelines or doing a general search for how to "select column not in GROUP BY" for your specific database.