Imperial777
@Imperial777
веб-юниор

Как сделать выборку доступных значений по параметру?

Здравствуйте, помогите, пожалуйста, составить MySQL запрос (хотя, думаю, одним запросом здесь не обойдется).
Суть - возможность выставления пользователем своего отношения к другому пользователю (как вконтакте - выбор второй половинки, братьев, сестер и т.д.)

Есть две таблицы:
relations_types:
id
title
sex - важность пола второго пользователя (например, для позиции "второй половинки" или брата (странно, если брат будет женского пола) принимает значения: 0 - все равно, 1 - мужской, 2 - женский, 3 - зависит от пола самого пользователя (т.е. если женский - то параметр становится мужского пола и наоборот)
is_multiple - возможность множественного выбора, т.е., например, несколько братьев/сестер

relations:
id
type_id - id в relations_types
user_id_from - от кого выбор отношения
user_id_to - какому пользователю
approved - принял ли user_id_to отношение

Нужно вывести список доступных типов отношений из таблицы relations_types так, чтобы соблюдался пол пользователя (т.е. для пользователя женского пола не вывелся тип отношения "брат" и т.д.; для второй половинки нельзя было выбрать пользователя того же пола); так же записи с типом отношения не было в таблице relations (хотя это необязательное условие; приоритетнее первое). Заранее спасибо.
P.S. Пардон, если вопрос задан коряво.
  • Вопрос задан
  • 2277 просмотров
Пригласить эксперта
Ответы на вопрос 2
Мне кажется вы перемудрили.
Есть таблица пользователей
id 1 - Маша
id 2 - Петя
id 3 - Ваня

Есть коды отношений
1 - дружба
2 - любовь
3 - родственные отношения
4 - ненависть

Делаем таблицу отношений id первого человека / id второго человека / отношение
1 / 2 / 2 - (Маша любит Петю)
3 / 1 / 2 - (Ваня любит Машу)
3 / 2 / 4 - (Ваня ненавидит Петю)
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT DISTINCT `rt`.`id`, `rt`.`title`, `rt`.`sex`
    FROM `relation_types` AS `rt`
    LEFT JOIN (SELECT `type_id` FROM `relations` WHERE `user_id_from` = :user_id) AS `r` 
        ON `r`.`type_id` = `rt`.`id`
    WHERE (`rt`.`is_multiply` = TRUE OR `r`.`type_id` IS NULL)
        AND (`rt`.`sex` = 0 OR `rt`.`sex` = :second_user_sex 
            OR (`rt`.`sex` = 3 AND :user_sex != :second_user_sex))
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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