TroL929
@TroL929
веб-программист

Как правильно сотавить mysql запрос?

Помогите пожалуйста составить правильный единный mysql запрос .
Имеется три таблицы "ankets", "users", "anket_group", "ankets_users"
anket_group - связывает группу пользователя с id анкеты
ankets_users - объединяет id пользователя и id анкеты, то есть к анкете может быть подключено несколько пользователей.
Пользователи делятся по группам (права доступа)

Нужно получить список анкет:
1) которые отправлены к группе "3" или "5" и определить пользователей которые имеют группу "3" или "5" и имеют доступ к этой анкете
2) которые отправлены к группе "3" или "5" но не назначены к пользователям с группой "3" или "5"

То есть. Есть анкеты к которым привязаны группы "3" или "5" их получаем и тут же смотрим в ankets_users какие пользователи подключены к анкете и если есть пользователи из группы "3" или "5" помечаем это, а если нету таких то помечаем что нету.

Отвечу на все наводящие вопросы. Заранее благодарю за конструктивные ответы

Сейчас запрос такой. И в нем я получаю список анкет которые прикреплены к первому списку (смотреть выше), но не выводит второй список
SELECT u.`group`, u.`id`, a.*
FROM `ankets` a
INNER JOIN anket_group ag ON ag.anketa = a.id AND ag.`status` = '1'
INNER JOIN `anket_user` au ON au.`anketa` = a.`id`
INNER JOIN `users` u ON u.`id` = au.`user` AND (u.`group` = 3 || u.`group` = 5)

Аналогичный пример.
Есть несколько школьных классов (учеников). К каждому классу прикреплены разные состав учителей (учителя математики, английскому, русскому...). Например математика и английский или математика и русский.
Есть несколько классов с математическим уклоном.
Нужно получить следующие списки:
1) все классы с математическим уклоном и с учителем математики
2) все классы с математическим уклоном но БЕЗ учителя математики
  • Вопрос задан
  • 329 просмотров
Решения вопроса 1
TroL929
@TroL929 Автор вопроса
веб-программист
Решил задачу

SELECT a.id, u.`group`, u.`id`, a.*
FROM `ankets` a
INNER JOIN anket_group ag ON ag.anketa = a.id AND ag.`status` = '1' AND (ag.`group` = '3' OR ag.`group` = '5')
LEFT JOIN `anket_user` au ON au.`anketa` = a.`id` AND au.`status` = '1' AND (SELECT COUNT(*) FROM `users` us WHERE us.id = au.`user` AND (us.`group` = '3' || us.`group` = '5')) > '0'
LEFT JOIN `users` u ON u.`id` = au.`user`
WHERE a.`delete` = 0 AND a.`status` = 2 AND u.`group` IS NULL GROUP BY a.`id`
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@heartdevil
плыву как воздушный шарик
Привет.
Если приведете описания таблиц, то можно попробовать более точно составить запрос.

Сложные запросы нужно составлять по частям. Давайте сначала объединим все приведенные вами таблицы.

Посмотрите пример. Он пока условный.

SELECT * FROM ankets AS a
INNER JOIN anket_group AS ag ON a.id = aq.aId
INNER JOIN ankets_users AS au ON a.id = au.aId
INNER JOIN users as u ON au.uId = u.id

Примерно так должно выглядеть объединение. Я могу ошибаться. Доработайте его и выложите настоящий запрос.

Далее нужно сделать вот такой фильтр:

Добавлять фильры нужно тоже по частям. Сразу всю логику проследить сложно. К тому же не понятно определение "имеют доступ". Как это выражается в таблицах?
Сначала напишите фильтр 1) и протестируйте только его, потом 2) и т.д. до 4.
1) которые отправлены к группе "3" или "5"
2) потом подумать над добавлением этого: и определить пользователей которые имеют группу "3" или "5"
3) далее добавить следующий фильтр: и имеют доступ к этой анкете
- которые отправлены к группе "3" или "5"

4) ну и наконец последний фильтр: но не назначены к пользователям с группой "3" или "5"

UPDATE:

SELECT u.`group`, u.`id`, a.*
FROM `ankets` a
INNER JOIN anket_group ag ON ag.anketa = a.id AND ag.`status` = '1'
INNER JOIN `anket_user` au ON au.`anketa` = a.`id`
INNER JOIN `users` u ON u.`id` = au.`user`
WHERE (ag.`group` = 3 OR ag.`group` = 5) AND ((u.`group` = 3 OR u.`group` = 5) OR NOT (u.`group` = 3 OR u.`group` = 5))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы