SQL помогите, часто нужно не знаю как красиво сделать.

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
lycifer3
Сообщения: 22
Зарегистрирован: 2016.03.24, 14:40

SQL помогите, часто нужно не знаю как красиво сделать.

Сообщение lycifer3 » 2018.01.18, 18:48

Доброго времени суток форумчане, есть такая структура таблиц
users в которой есть id, name и professions где есть id, user_id, profession
У одного юзера может быть несколько професий (один ко многим).
Нужно получит юзеров у которых професии например (программист и волонтер).

Желательно решение без вложеных запросов, я уже голову сломал не знаю как без вложеных и возможно ли вообще.

Аватара пользователя
Balu
Сообщения: 17
Зарегистрирован: 2017.12.04, 12:15

Re: SQL помогите, часто нужно не знаю как красиво сделать.

Сообщение Balu » 2018.01.18, 21:40

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

$prof = "coder";
$users = User::find()
    ->joinWith('professions')
    ->where(['like', 'professions.profession', $prof])
    ->all();

lycifer3
Сообщения: 22
Зарегистрирован: 2016.03.24, 14:40

Re: SQL помогите, часто нужно не знаю как красиво сделать.

Сообщение lycifer3 » 2018.01.19, 14:11

Balu писал(а):
2018.01.18, 21:40

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

$prof = "coder";
$users = User::find()
    ->joinWith('professions')
    ->where(['like', 'professions.profession', $prof])
    ->all();
Вопрос в том если выбрать по нескольким професиям
например выбрать людей которые работают кодерами и волонтерами, желательно в чистом sql


lycifer3
Сообщения: 22
Зарегистрирован: 2016.03.24, 14:40

Re: SQL помогите, часто нужно не знаю как красиво сделать.

Сообщение lycifer3 » 2018.01.19, 14:48

Nex-Otaku писал(а):
2018.01.19, 14:39
OR
условие не или, а именно и там и там

lycifer3
Сообщения: 22
Зарегистрирован: 2016.03.24, 14:40

Re: SQL помогите, часто нужно не знаю как красиво сделать.

Сообщение lycifer3 » 2018.01.19, 14:54

Пока что есть решения только с вложеными запросами, или джоин на саму себя, но тут если количество выбераемых професий увеличится то прийдется дописывать джоины или вложеные.
Может найдется ГУРУ SQL-а да подскажет как все-же правильно сделать.

Аватара пользователя
Balu
Сообщения: 17
Зарегистрирован: 2017.12.04, 12:15

Re: SQL помогите, часто нужно не знаю как красиво сделать.

Сообщение Balu » 2018.01.19, 15:16

Только вложенные, просто не получится - попадете на IMPOSSIBLE WHERE

Аватара пользователя
Alexum
Сообщения: 478
Зарегистрирован: 2016.09.26, 10:00

Re: SQL помогите, часто нужно не знаю как красиво сделать.

Сообщение 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
Структура у вас недодуманная. По хорошему записи профессий должны быть уникальными и связываться с юзерами через промежуточную таблицу.

Аватара пользователя
Balu
Сообщения: 17
Зарегистрирован: 2017.12.04, 12:15

Re: SQL помогите, часто нужно не знаю как красиво сделать.

Сообщение 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 профессиями

Аватара пользователя
Alexum
Сообщения: 478
Зарегистрирован: 2016.09.26, 10:00

Re: SQL помогите, часто нужно не знаю как красиво сделать.

Сообщение Alexum » 2018.01.19, 17:33

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

Аватара пользователя
Balu
Сообщения: 17
Зарегистрирован: 2017.12.04, 12:15

Re: SQL помогите, часто нужно не знаю как красиво сделать.

Сообщение Balu » 2018.01.19, 17:40

Согласен, невнимателен

Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: SQL помогите, часто нужно не знаю как красиво сделать.

Сообщение Nerf » 2018.01.20, 00:43

Alexum писал(а):
2018.01.19, 15:24
Структура у вас недодуманная. По хорошему записи профессий должны быть уникальными и связываться с юзерами через промежуточную таблицу.
С 1 утверждением все понятно, но чем промежуточная таблица поможет: professions и есть промежуточная по сути, в чем смысл?

lycifer3
Сообщения: 22
Зарегистрирован: 2016.03.24, 14:40

Re: SQL помогите, часто нужно не знаю как красиво сделать.

Сообщение lycifer3 » 2018.01.23, 21:35

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

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
Спасибо такой вариант порядком лучше моих.

kawabanga
Сообщения: 747
Зарегистрирован: 2013.10.12, 23:35
Откуда: Новосибирск

Re: SQL помогите, часто нужно не знаю как красиво сделать.

Сообщение kawabanga » 2018.01.24, 06:13

это при условии, что у вас всего одна запись, что человек программист, и всего одна запись, что он волонтер.

mkramer
Сообщения: 451
Зарегистрирован: 2014.12.14, 13:02

Re: SQL помогите, часто нужно не знаю как красиво сделать.

Сообщение mkramer » 2018.01.24, 10:39

Люди-профессии должна быть связь многие-ко-многим, а не один ко многим: одна профессия может быть у нескольких человек, один человек может иметь несколько профессий. Поэтому и нужна промежуточная таблица

Ответить