2013-08-03 4 views
0

App целиВыберите строку на основе значения другого ряда

Отправка сообщений от розничных торговцев для зарегистрированных пользователей мобильных устройств с помощью GCM

DB архитектура

У меня есть customers стола и связанные с использованием customers_realtions таблица со следующими полями: id, customerID, retailerID, isBlocked

Требуемый результат

Клиент может зарегистрировать для конкретного продавца, или для шаблона (все из них).

В случае регистрации всех розничных продавцов у него есть возможность заблокировать конкретного продавца от отправки будущих сообщений, эффективно создавая черный список.

значения DB для каждого состояния

  1. Когда клиент регистрируется для одного розничного retailerID назначается с розничной ID.
  2. Когда регистр клиентов для всех розничных retailerID равен 1.
  3. Когда блоки клиентов розничного торговца есть два варианта:

    а. если он зарегистрирован в этом конкретном розничном магазине до того, как поле 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 

Вопрос

В то время как это работает для единственный клиент, для которого я знаю идентификатор заранее, я изо всех сил пытаюсь понять способ написания подобного запроса для нескольких клиентов.

+0

Что произойдет, если пользователь несколько раз блокирует и разблокирует розничный торговец? Сколько строк создается? –

+0

, очевидно, строка создается только в том случае, если пользователь не зарегистрировался в этом конкретном розничном магазине до того, как он зарегистрировался для всех розничных продавцов. В случае, если он зарегистрировался для конкретного продавца, значение 'isBlocked' просто обновляется соответствующим образом. – Matanya

+0

. , Посмотрите на шаг (3) в своем описании того, как работает система. В нем явно говорится, что новая строка создается, когда розничный торговец заблокирован. Вот почему я задал вопрос. Тогда первый запрос в моем ответе будет правильным. –

ответ

1

Я думаю об этом как об агрегировании запроса.Вы хотите, чтобы просмотреть все строки, которые не заблокированы для клиента и определить, является ли розничный торговец 111 доступен или все предприятия розничной торговли доступны:

SELECT customerId 
FROM customers_relations cr 
WHERE isBlocked = false 
GROUP BY customerId 
HAVING MAX(retailId = 111) > 0 OR 
     MAX(retailId = 1) > 0; 

Я заметил, что ваш вопрос на самом деле говорит о том, что новый строка создается в customer_relations, когда кто-то заблокирован. Вышеприведенное предполагает наличие одной строки. Для обработки случая, когда блок в любой строке вызовет блок, то:

SELECT customerId 
FROM customers_relations cr 
GROUP BY customerId 
HAVING (MAX(retailId = 111) > 0 OR 
     MAX(retailId = 1) > 0 
     ) AND 
     MAX(retailId = 111 AND isblocked = true) = 0; 
+0

Второй работает. Спасибо – Matanya

Смежные вопросы