4

Sqlite room нужна помощь

Всех приветствую. Недавно начал изучать room(надстройка над sqlite в kotlin). Если есть кто шарящий - подскажите. Есть 3 таблицы employee, employees_skills, skills. В employees_skills хранятся все связи сотрудников с навыками в виде: id, employeeId, skillId. Есть задача в room получать все employees у которых есть определенный skill и наоборот, все skills которые есть у определенного employee.
Вопрос: как правильно составить запрос на получение этих данных, через join? Сутки копаю гугл и не пришел к какому- то пониманию join вообще. Единственное, к чему пришел, вот такой вложенный запрос

"SELECT * FROM employee_list WHERE id in (SELECT employeeID FROM employees_skills WHERE skillId = :skillId)"

Код работает, но как мне подсказали, лучше вложенный запрос не делать, а делать через 2 inner join.Как это сделать правильно - естественно не подсказали.
если подскажете, как это вывести либо в виде списка объектов employee либо в виде map(skillId - List<employee>) буду прям очень благодарен.

Лига Сисадминов

2.7K постов19.2K подписчиков

Правила сообщества

Мы здесь рады любым постам связанным с рабочими буднями специалистов нашей сферы деятельности.

Вы смотрите срез комментариев. Показать все
7
Автор поста оценил этот комментарий

-- Получить все employees у которых есть определенный skill

SELECT

e.*

FROM

employee e

JOIN employees_skills es ON e.id = es.employeeId

JOIN skills s ON es.skillId = s.id

WHERE

s.skill_name = 'desired_skill';

-- Получить все skills которые есть у определенного employee

SELECT

s.*

FROM

skills s

JOIN employees_skills es ON s.id = es.skillId

JOIN employee e ON es.employeeId = e.id

WHERE

e.id = desired_employee_id;

раскрыть ветку (11)
1
один из этих...
Автор поста оценил этот комментарий

Так то не мое собачье дело, но два вопроса:

1-

вот это вот "employee e" - это вы буквы экономите, чтоб тот, кто ваши селекты читать будет - хуем подавился, который вы на него положили? :)


2 не шарю в SQL, но вроде как joun без left или right = full join, и он вернет все skills, у которых нет ни одного employees, и всех employees у которых нет ни одного skills

раскрыть ветку (6)
4
Автор поста оценил этот комментарий
Отвечу на первый вопрос со стороны тех кто долго профессионально работает с SQL. На самом деле такое написание запросов является общепринятым стандартом и хорошей практикой. На то есть свои причины:
1. В больших прод системах запросы почти всегда содержат десятки джойнов и названия таблиц далеко не всегда короткие. Большой запрос написанный с алиасами читать гораздо удобнее.
2. Так быстрее и удобнее писать запросы без ошибок. Мелкие запросы обычно пишут для себя, а не для кого то другого. В реальных проектах для мелких запросов в коде используют ORM.
3. Так проще изменять, рефакторить и тестировать запрос т.к путь к целевой таблице всегда можно изменить в одном месте.
4. В некоторых случаях без алиасов вообще не обойтись, например, при джойне таблицы самой на себя.
В итоге опытные разрабы привыкают писать все запросы в общепринятом стиле, в котором проще писать, читать и сопровождать эти запросы другим опытным разрабам, а не всяким хуесосам :) так же как и код на ООП.
На второй вопрос уже ответили. Без указания типа джойна всегда используется inner join.
раскрыть ветку (1)
2
один из этих...
Автор поста оценил этот комментарий

Воо. Будем знать :)

2
Автор поста оценил этот комментарий
1. Шутейка про сокращения огонь - запишем
2.join без left/right это inner join, если я правильно курил литературу.
раскрыть ветку (2)
0
один из этих...
Автор поста оценил этот комментарий

Хз. Я не читал, по этому думал "full" :)

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
inner join=join
left outer join=left join
right outer join= right join
full join=full join
0
Автор поста оценил этот комментарий

Да это пример пацану дальше он сам разберется

0
Автор поста оценил этот комментарий
Спасибо большое. Т.е. я правильно понимаю, что начинать нужно с таблицы, чьи данные нам нужны, и заканчивать таблицей, id которой у нас есть? Вот почему я запутался, я пытался начать с того id по которому надо искать
раскрыть ветку (3)
2
Автор поста оценил этот комментарий

Так джун )) давай я тебе дам инструмент который у меня юзают в "ясельках" джунов

https://www.text2sql.ai/app

вот тут давай начинай пробовать и на своих же примерах ты быстрее поймешь чем я буду тебе заяснять (мало того еще и освоишь инструмент)

1
Автор поста оценил этот комментарий

Без разницы, как тебе проще представить, так и делай.

таблица employees_skills обьединяет данные из employee и skills через employee.ID и skills.ID , так что вне зависимости от порядка таблиц

SELECT * -- all columns

FROM

employee e

JOIN employees_skills es ON e.id = es.employeeId

JOIN skills s ON es.skillId = s.id

тебе будет давать одинаковое количество результатов, которые потом можно вычленить через alias таблицы (e для employee, s для skills , итд )

Но для простоты можно начать с таблицы, данные которой пойдут в SELECT, как ты и сделал

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Спасибо огромное. Покопавшись с вариантами, к такому и пришел. У меня ситуация просто чуток сложнее, мне помимо составления запроса нужно было ещё понимать, как room его для себя интерпретирует. Теперь я понял, что я просто собираю данные из нескольких таблиц в строку, а room сам определяет в какую переменную что засунуть. Уже опробовал, получение в виде map, где ключём является skill, а значением -список employees
Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества