SQL помогите, часто нужно не знаю как красиво сделать.
SQL помогите, часто нужно не знаю как красиво сделать.
Доброго времени суток форумчане, есть такая структура таблиц
users в которой есть id, name и professions где есть id, user_id, profession
У одного юзера может быть несколько професий (один ко многим).
Нужно получит юзеров у которых професии например (программист и волонтер).
Желательно решение без вложеных запросов, я уже голову сломал не знаю как без вложеных и возможно ли вообще.
users в которой есть id, name и professions где есть id, user_id, profession
У одного юзера может быть несколько професий (один ко многим).
Нужно получит юзеров у которых професии например (программист и волонтер).
Желательно решение без вложеных запросов, я уже голову сломал не знаю как без вложеных и возможно ли вообще.
Re: SQL помогите, часто нужно не знаю как красиво сделать.
Код: Выделить всё
$prof = "coder";
$users = User::find()
->joinWith('professions')
->where(['like', 'professions.profession', $prof])
->all();
Re: SQL помогите, часто нужно не знаю как красиво сделать.
Вопрос в том если выбрать по нескольким професиямBalu писал(а): ↑2018.01.18, 21:40Код: Выделить всё
$prof = "coder"; $users = User::find() ->joinWith('professions') ->where(['like', 'professions.profession', $prof]) ->all();
например выбрать людей которые работают кодерами и волонтерами, желательно в чистом sql
Re: SQL помогите, часто нужно не знаю как красиво сделать.
Пока что есть решения только с вложеными запросами, или джоин на саму себя, но тут если количество выбераемых професий увеличится то прийдется дописывать джоины или вложеные.
Может найдется ГУРУ SQL-а да подскажет как все-же правильно сделать.
Может найдется ГУРУ SQL-а да подскажет как все-же правильно сделать.
Re: SQL помогите, часто нужно не знаю как красиво сделать.
Только вложенные, просто не получится - попадете на IMPOSSIBLE WHERE
Re: SQL помогите, часто нужно не знаю как красиво сделать.
Код: Выделить всё
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 помогите, часто нужно не знаю как красиво сделать.
С таким условием он выберет людей с оператором ИЛИ, а насколько я правильно понял, человеку нужно выбрать людей работающих сразу в двух профессиях. То есть один человек обязательно должен быть и программистом и волонтером. IN выберет всех и просто программеров и просто волонтеров и людей с этими 2 профессиями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
Re: SQL помогите, часто нужно не знаю как красиво сделать.
Я не просто так добавилBalu писал(а): ↑2018.01.19, 17:01С таким условием он выберет людей с оператором ИЛИ, а насколько я правильно понял, человеку нужно выбрать людей работающих сразу в двух профессиях. То есть один человек обязательно должен быть и программистом и волонтером. IN выберет всех и просто программеров и просто волонтеров и людей с этими 2 профессиями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
Код: Выделить всё
HAVING COUNT(profession) = 2
Re: SQL помогите, часто нужно не знаю как красиво сделать.
Согласен, невнимателен
Re: SQL помогите, часто нужно не знаю как красиво сделать.
Код: Выделить всё
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 помогите, часто нужно не знаю как красиво сделать.
это при условии, что у вас всего одна запись, что человек программист, и всего одна запись, что он волонтер.
Re: SQL помогите, часто нужно не знаю как красиво сделать.
Люди-профессии должна быть связь многие-ко-многим, а не один ко многим: одна профессия может быть у нескольких человек, один человек может иметь несколько профессий. Поэтому и нужна промежуточная таблица