App целиВыберите строку на основе значения другого ряда
Отправка сообщений от розничных торговцев для зарегистрированных пользователей мобильных устройств с помощью GCM
DB архитектура
У меня есть customers
стола и связанные с использованием customers_realtions
таблица со следующими полями: id
, customerID
, retailerID
, isBlocked
Требуемый результат
Клиент может зарегистрировать для конкретного продавца, или для шаблона (все из них).
В случае регистрации всех розничных продавцов у него есть возможность заблокировать конкретного продавца от отправки будущих сообщений, эффективно создавая черный список.
значения DB для каждого состояния
- Когда клиент регистрируется для одного розничного
retailerID
назначается с розничной ID. - Когда регистр клиентов для всех розничных
retailerID
равен 1. Когда блоки клиентов розничного торговца есть два варианта:
а. если он зарегистрирован в этом конкретном розничном магазине до того, как поле
isBlocked
будет обновлено до 1 (true)b. если он зарегистрирован на всех розничных торговцев, прежде чем новая строка создается для этого ритейлера и
isBlocked
устанавливается в 1 (истина)
Задача
При отправке сообщения SELECT, запрос должен включать клиентов что имеет retailerID 1, а не есть отправка retailerID
когда isBlocked
равен 1.
Например, в этой ситуации
id customerID retailID isBlocked
129 46 111 1
128 46 1 0
Я не хочу, чтобы клиент должен быть выбран, даже если retailerID является 111
Моя попытка
SELECT * FROM customers_relations
WHERE
(retailID=111
OR
(retailID=1
AND
(SELECT isBlocked FROM `customers_relations` WHERE customerID=46 AND retailID=111)=0))
AND
NOT isBlocked
Вопрос
В то время как это работает для единственный клиент, для которого я знаю идентификатор заранее, я изо всех сил пытаюсь понять способ написания подобного запроса для нескольких клиентов.
Что произойдет, если пользователь несколько раз блокирует и разблокирует розничный торговец? Сколько строк создается? –
, очевидно, строка создается только в том случае, если пользователь не зарегистрировался в этом конкретном розничном магазине до того, как он зарегистрировался для всех розничных продавцов. В случае, если он зарегистрировался для конкретного продавца, значение 'isBlocked' просто обновляется соответствующим образом. – Matanya
. , Посмотрите на шаг (3) в своем описании того, как работает система. В нем явно говорится, что новая строка создается, когда розничный торговец заблокирован. Вот почему я задал вопрос. Тогда первый запрос в моем ответе будет правильным. –