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

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

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

Сообщение lycifer3 »

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

Желательно решение без вложеных запросов, я уже голову сломал не знаю как без вложеных и возможно ли вообще.
Аватара пользователя
Balu
Сообщения: 17
Зарегистрирован: 2017.12.04, 12:15

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

Сообщение Balu »

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

$prof = "coder";
$users = User::find()
    ->joinWith('professions')
    ->where(['like', 'professions.profession', $prof])
    ->all();
lycifer3
Сообщения: 23
Зарегистрирован: 2016.03.24, 14:40

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

Сообщение lycifer3 »

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

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

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

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

Сообщение lycifer3 »

Nex-Otaku писал(а): 2018.01.19, 14:39OR
условие не или, а именно и там и там
lycifer3
Сообщения: 23
Зарегистрирован: 2016.03.24, 14:40

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

Сообщение lycifer3 »

Пока что есть решения только с вложеными запросами, или джоин на саму себя, но тут если количество выбераемых професий увеличится то прийдется дописывать джоины или вложеные.
Может найдется ГУРУ SQL-а да подскажет как все-же правильно сделать.
Аватара пользователя
Balu
Сообщения: 17
Зарегистрирован: 2017.12.04, 12:15

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

Сообщение Balu »

Только вложенные, просто не получится - попадете на IMPOSSIBLE WHERE
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

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

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

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

Сообщение 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 профессиями
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

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

Сообщение 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
Аватара пользователя
Balu
Сообщения: 17
Зарегистрирован: 2017.12.04, 12:15

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

Сообщение Balu »

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

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

Сообщение Nerf »

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

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

Сообщение 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
Спасибо такой вариант порядком лучше моих.
kawabanga
Сообщения: 806
Зарегистрирован: 2013.10.12, 23:35
Откуда: Новосибирск

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

Сообщение kawabanga »

это при условии, что у вас всего одна запись, что человек программист, и всего одна запись, что он волонтер.
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

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

Сообщение mkramer »

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