Выборка через таблицу связи в Kotlin
Запрос, который вытащит юзеров вместе с их городами, делает два соединения: первое присоединит к юзерам таблицу связи, а второе по связям присоединит города:
SELECT
users.name AS user_name, cities.name AS city_name
FROM
users
LEFT JOIN users_cities
ON users_cities.user_id = users.id
LEFT JOIN cities
ON users_cities.city_id = cities.id
Результат запроса
Результат запроса в Kotlin содержит имя каждого юзера столько раз, со сколькими городами он связан:
val data = listOf(
mapOf("user_name" to "user1", "city_name" to "city1"),
mapOf("user_name" to "user1", "city_name" to "city2"),
mapOf("user_name" to "user1", "city_name" to "city3"),
mapOf("user_name" to "user2", "city_name" to "city1"),
mapOf("user_name" to "user2", "city_name" to "city2"),
mapOf("user_name" to "user3", "city_name" to "city2"),
mapOf("user_name" to "user3", "city_name" to "city3"),
mapOf("user_name" to "user4", "city_name" to "city1")
)
Удобнее переконвертировать такой результат и превратить его в следующий:
val res = mapOf(
"user1" to listOf("city1", "city2", "city3"),
"user2" to listOf("city1", "city2"),
"user3" to listOf("city2", "city3"),
"user4" to listOf("city1")
)
Давайте напишем код, выполняющий такую конвертацию:
val res = mutableMapOf<String, MutableList<String>>()
for (elem in data) {
val name = elem.getValue("user_name")
val city = elem.getValue("city_name")
val cities = res.getOrPut(name) { mutableListOf() }
cities.add(city)
}
println(res)
Напишите запрос, который достанет товары вместе с их категориями. Товар может принадлежать нескольким категориям.
Выведите полученные данные в консоль так, чтобы в каждой строке сначала стояло имя продукта, а после двоеточия через запятую перечислялись категории этого продукта:
product1: category1, category2, category3
product2: category1, category3
product3: category1