У меня есть запрос, который выбирает пользователей из таблицы members
, если mem_id
не существует в таблице swipes
. Запрос выглядит следующим образом:
SELECT members.* FROM members
WHERE NOT EXISTS (SELECT * FROM swipes WHERE (mem_id IN (swp_by, swp_to) AND :mem IN (swp_by)))
Приведенный выше запрос выполняет половину моей работы. Однако я хочу добавить еще пару условий здесь. В таблице swipes
есть два поля, а именно swp_type
и swp_status
. Здесь swp_type
имеет ENUM
значения left, right, top
, которые показывают, что карта прошла слева, справа или сверху (как трут), а swp_status
также имеет ENUM
значения requested, accepted, declined, unmatched
, которая указывает, что запрошенный друг все еще запрашивается Государство, или принято, или отклонено, или позже, после принятия не имеет себе равных. Теперь я хочу изменить приведенный выше запрос, чтобы он принимал эти две таблицы в условиях и возвращал результат на их основе.
Давайте рассмотрим пример:
Допустим, есть два пользователя 1 и 2. Сейчас в таблице swipes
нет записей, чтобы пользователи 1 и 2 могли видеть друг друга.
Теперь, скажем, если пользователь 1 УДАЛ ЛЕВЫЙ пользователь 2, то:
swp_by: 1, swp_to: 2, swp_type: left, swp_status: requested
Для приведенных выше данных пользователь 1 УДАЛ ЛИСТ пользователь 2 (что означает, что пользователь 1 не хочет совпадать с пользователем 2) чтобы они больше не могли видеть друг друга.
Теперь, скажем, если пользователь 1 правый или верхний пользователь 2, то:
swp_by: 1, swp_to: 2, swp_type: right/top, swp_status: requested
Для приведенных выше данных пользователь 1 больше не может видеть пользователя 2, но пользователь 2 может видеть пользователь 1 как swp_type
здесь прав, а swp_status
равен requested
.
Теперь, скажем, для приведенных выше данных swp_status
не requested
, но все остальное, кроме requested
скажем (принято) / отказался), тогда оба пользователя больше не смогут видеть друг друга. Это то, что я хочу добавить в свой текущий запрос в качестве условия.
Мой текущий запрос выполняет половину работы, отображая членов, которых нет в таблице swipes
с учетом swp_by
& swp_to
. Я хочу добавить условия для swp_type
и swp_status
, как описано выше.
Что я пробовал?
Я попробовал следующее, но в итоге получаю странные результаты. Он вернул все элементы, когда в соответствии с данными он должен возвращать элемент только с mem_id
8
, так как он не существует в таблице смахиваний по отношению к пользователю 1 и пользователю 12
, как это right
и requested
и пользователь 15
как есть top
и requested
.
SELECT * FROM members
WHERE NOT EXISTS (SELECT * FROM swipes WHERE (mem_id IN (swp_by, swp_to) AND 1 IN (swp_by)) AND swp_type != 'left' AND swp_status = 'requested')
Следовательно, я думаю, что это не то, как я должен размещать условия.
Fiddle Here: DB FIDDLE