Страница 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
Nex-Otaku писал(а): 2018.01.19, 14:39OR
условие не или, а именно и там и там

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 профессиями
Я не просто так добавил

Код: Выделить всё

HAVING COUNT(profession) = 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
Люди-профессии должна быть связь многие-ко-многим, а не один ко многим: одна профессия может быть у нескольких человек, один человек может иметь несколько профессий. Поэтому и нужна промежуточная таблица