'How to query an Entity from a Many-to-Many realtionship dependendt on two ore more conditions in Ktor with the Kotlin Exposed Framework?

I have 3 entities:

User
id: Int
name: String
Room
id: Int
name: String
RoomUser
id: Int
room_id: Int (Reference on Room.id)
user_id: Int (Reference on User.id)

Now lets say we have 2 rooms and 3 users:

Rooms:

id name
1 Room1
2 Room2

Users:

id name
3 User3
7 User7
9 User9

RoomUsers:

id room_id user_id
1 1 3
2 1 7
3 2 7
4 2 9

As you can see, User3 and User7 are in the room Room1 and User7 and User9 are in the room Room2.

In my use case I have given for example 2 users. Now I want to get the room, in which these both Users are.

In this case, when I have given the users User3 and User7 I want to get the room Room1 or when I have given the users User7 and User9 I want to get the room Room2.

How can I write an query with the Kotlin Exposed Framework to get this specific room?



Solution 1:[1]

In SQL notation it should be like:

SELECT room_id
FROM RoomUsers
where user_id in (3,7)
GROUP BY room_id
HAVING count(*) = 2

In Exposed:

RoomUsers
  .slice(RoomUsers.roomId)
  .select{
     RoomUsers.userId inList listOf(User3.id, User7.id)
  }
  .groupBy(RoomUsers.roomId)
  .having {
    RoomUsers.userId.count() eq 2
  }.map {
    it[RoomUsers.roomId]
  }

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Tapac