Помогите пожалуйста составить правильный единный 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) все классы с математическим уклоном но БЕЗ учителя математики
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`
Привет.
Если приведете описания таблиц, то можно попробовать более точно составить запрос.
Сложные запросы нужно составлять по частям. Давайте сначала объединим все приведенные вами таблицы.
Посмотрите пример. Он пока условный.
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))
Это я сделал.
1 вариант. Мне удалось получить анкеты которые отправлены к группе "3" или "5" и определил пользователей которые имеют группу "3" или "5" и имеют доступ к этой анкете. Но тут не определяет анкеты которые включены в группу и не подключенные к пользователя
2 вариант. Получаю все пользователе которые включены в группу и добавлены и добавлены к пользователям. Но тут ид пользователя подставляется из других групп (если к анкете привязаны пользователи других групп)
Вячеслав Беляев: Нужны примеры вывода запросов и сами запросы. Лично мне сложно что-то вам посоветовать, так как я даже не вижу проблему вашими глазами.
Вячеслав Беляев: Есть вопрос, а вот это условие: список анкет, которые отправлены к группе "3" или "5" -- где оно в вашем запросе? Как я понял, вот это условие (u.`group` = 3 || u.`group` = 5), говорит только, что пользователи имеют группу 3 или 5.
heartdevil: INNER JOIN anket_group ag ON ag.anketa = a.id AND ag.`status` = '1' AND (ag.`group` = 3 OR (ag.`group` = 5) можно и это дописать. Но результат остается прежний
heartdevil: Я тоже подобный запрос писал. Но в ответе в u.`group` поставляется произвольная группа, а надо 3 или 5 или (не 3 и не 5) (именно в таком приоритете)
heartdevil: к сожалению нет, конфиденциальная информация. Но я постараюсь найти время что бы "демо" дамп сделать. Может знаете как получить только второй список?
Вячеслав Беляев: Аха. Было бы более продуктивно. Сейчас просто я на основе вашего запроса мудрю с условиями. А на основе приближенных данных и структуры таблиц более ясно будет. Попробуйте так (ag.`group` = 3 OR ag.`group` = 5) AND u.`group` NOT IN (3, 5) -- это только по второму пункту по идее.