Страница 1 из 1
SQL помогите, часто нужно не знаю как красиво сделать.
Добавлено: 2018.01.18, 18:48
lycifer3
Доброго времени суток форумчане, есть такая структура таблиц
users в которой есть id, name и professions где есть id, user_id, profession
У одного юзера может быть несколько професий (один ко многим).
Нужно получит юзеров у которых професии например (программист и волонтер).
Желательно решение без вложеных запросов, я уже голову сломал не знаю как без вложеных и возможно ли вообще.
Re: SQL помогите, часто нужно не знаю как красиво сделать.
Добавлено: 2018.01.18, 21:40
Balu
Код: Выделить всё
$prof = "coder";
$users = User::find()
->joinWith('professions')
->where(['like', 'professions.profession', $prof])
->all();
Re: SQL помогите, часто нужно не знаю как красиво сделать.
Добавлено: 2018.01.19, 14:11
lycifer3
Balu писал(а): ↑2018.01.18, 21:40
Код: Выделить всё
$prof = "coder";
$users = User::find()
->joinWith('professions')
->where(['like', 'professions.profession', $prof])
->all();
Вопрос в том если выбрать по нескольким професиям
например выбрать людей которые работают кодерами и волонтерами, желательно в чистом sql
Re: SQL помогите, часто нужно не знаю как красиво сделать.
Добавлено: 2018.01.19, 14:39
Nex-Otaku
OR
Re: SQL помогите, часто нужно не знаю как красиво сделать.
Добавлено: 2018.01.19, 14:48
lycifer3
условие не или, а именно и там и там
Re: SQL помогите, часто нужно не знаю как красиво сделать.
Добавлено: 2018.01.19, 14:54
lycifer3
Пока что есть решения только с вложеными запросами, или джоин на саму себя, но тут если количество выбераемых професий увеличится то прийдется дописывать джоины или вложеные.
Может найдется ГУРУ SQL-а да подскажет как все-же правильно сделать.
Re: SQL помогите, часто нужно не знаю как красиво сделать.
Добавлено: 2018.01.19, 15:16
Balu
Только вложенные, просто не получится - попадете на IMPOSSIBLE WHERE
Re: SQL помогите, часто нужно не знаю как красиво сделать.
Добавлено: 2018.01.19, 15:24
Alexum
Код: Выделить всё
SELECT u.id FROM users u
LEFT jOIN professions p ON p.user_id = u.id
WHERE profession IN ('программист','волонтер')
GROUP BY u.id
HAVING COUNT(profession) = 2
Структура у вас недодуманная. По хорошему записи профессий должны быть уникальными и связываться с юзерами через промежуточную таблицу.
Re: SQL помогите, часто нужно не знаю как красиво сделать.
Добавлено: 2018.01.19, 17:01
Balu
Alexum писал(а): ↑2018.01.19, 15:24
Код: Выделить всё
SELECT u.id FROM users u
LEFT jOIN professions p ON p.user_id = u.id
WHERE profession IN ('программист','волонтер')
GROUP BY u.id
HAVING COUNT(profession) = 2
Структура у вас недодуманная. По хорошему записи профессий должны быть уникальными и связываться с юзерами через промежуточную таблицу.
С таким условием он выберет людей с оператором ИЛИ, а насколько я правильно понял, человеку нужно выбрать людей работающих сразу в двух профессиях. То есть один человек обязательно должен быть и программистом и волонтером. IN выберет всех и просто программеров и просто волонтеров и людей с этими 2 профессиями
Re: SQL помогите, часто нужно не знаю как красиво сделать.
Добавлено: 2018.01.19, 17:33
Alexum
Balu писал(а): ↑2018.01.19, 17:01
Alexum писал(а): ↑2018.01.19, 15:24
Код: Выделить всё
SELECT u.id FROM users u
LEFT jOIN professions p ON p.user_id = u.id
WHERE profession IN ('программист','волонтер')
GROUP BY u.id
HAVING COUNT(profession) = 2
Структура у вас недодуманная. По хорошему записи профессий должны быть уникальными и связываться с юзерами через промежуточную таблицу.
С таким условием он выберет людей с оператором ИЛИ, а насколько я правильно понял, человеку нужно выбрать людей работающих сразу в двух профессиях. То есть один человек обязательно должен быть и программистом и волонтером. IN выберет всех и просто программеров и просто волонтеров и людей с этими 2 профессиями
Я не просто так добавил
Re: SQL помогите, часто нужно не знаю как красиво сделать.
Добавлено: 2018.01.19, 17:40
Balu
Согласен, невнимателен
Re: SQL помогите, часто нужно не знаю как красиво сделать.
Добавлено: 2018.01.20, 00:43
Nerf
Alexum писал(а): ↑2018.01.19, 15:24
Структура у вас недодуманная. По хорошему записи профессий должны быть уникальными и связываться с юзерами через промежуточную таблицу.
С 1 утверждением все понятно, но чем промежуточная таблица поможет: professions и есть промежуточная по сути, в чем смысл?
Re: SQL помогите, часто нужно не знаю как красиво сделать.
Добавлено: 2018.01.23, 21:35
lycifer3
Код: Выделить всё
SELECT u.id FROM users u
LEFT jOIN professions p ON p.user_id = u.id
WHERE profession IN ('программист','волонтер')
GROUP BY u.id
HAVING COUNT(profession) = 2
Спасибо такой вариант порядком лучше моих.
Re: SQL помогите, часто нужно не знаю как красиво сделать.
Добавлено: 2018.01.24, 06:13
kawabanga
это при условии, что у вас всего одна запись, что человек программист, и всего одна запись, что он волонтер.
Re: SQL помогите, часто нужно не знаю как красиво сделать.
Добавлено: 2018.01.24, 10:39
mkramer
Люди-профессии должна быть связь многие-ко-многим, а не один ко многим: одна профессия может быть у нескольких человек, один человек может иметь несколько профессий. Поэтому и нужна промежуточная таблица