Выборка через таблицу связи в Java
Запрос, который вытащит юзеров вместе с их городами, делает два соединения: первое присоединит к юзерам таблицу связи, а второе по связям присоединит города:
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
Результат запроса
Результат запроса в Java содержит имя каждого юзера столько раз, со сколькими городами он связан:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Main {
public static void main(String[] args) {
List<Map<String, String>> data = List.of(
Map.of("user_name", "user1", "city_name", "city1"),
Map.of("user_name", "user1", "city_name", "city2"),
Map.of("user_name", "user1", "city_name", "city3"),
Map.of("user_name", "user2", "city_name", "city1"),
Map.of("user_name", "user2", "city_name", "city2"),
Map.of("user_name", "user3", "city_name", "city2"),
Map.of("user_name", "user3", "city_name", "city3"),
Map.of("user_name", "user4", "city_name", "city1")
);
}
}
Удобнее переконвертировать такой результат и превратить его в следующий:
import java.util.List;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, List<String>> res = Map.of(
"user1", List.of("city1", "city2", "city3"),
"user2", List.of("city1", "city2"),
"user3", List.of("city2", "city3"),
"user4", List.of("city1")
);
}
}
Теперь напишем код, выполняющий такую конвертацию:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Main {
public static void main(String[] args) {
List<Map<String, String>> data = List.of(
Map.of("user_name", "user1", "city_name", "city1"),
Map.of("user_name", "user1", "city_name", "city2"),
Map.of("user_name", "user1", "city_name", "city3"),
Map.of("user_name", "user2", "city_name", "city1"),
Map.of("user_name", "user2", "city_name", "city2"),
Map.of("user_name", "user3", "city_name", "city2"),
Map.of("user_name", "user3", "city_name", "city3"),
Map.of("user_name", "user4", "city_name", "city1")
);
Map<String, List<String>> res = new HashMap<>();
for (Map<String, String> elem : data) {
String name = elem.get("user_name");
String city = elem.get("city_name");
res.computeIfAbsent(name, k -> new ArrayList<>()).add(city);
}
System.out.println(res);
}
}
Напишите запрос, который достанет товары вместе с их категориями. Товар может принадлежать нескольким категориям.
Выведите полученные данные в консоль так, чтобы в каждой строке сначала стояло имя продукта, а после двоеточия через запятую перечислялись категории этого продукта:
product1: category1, category2, category3
product2: category1, category3
product3: category1