2013-08-03 40 views
0

应用目标基于另一行

通过GCM零售商将消息发送到注册用户的移动

DB架构

我有一个customers表和价值选择行相关customers_realtions表与下列字段:id,customerID, retailerID,isBlocked

所需取得的成果

客户可以针对特定的零售商登记,或通配符(所有的)。

如果向所有零售商注册,他可以选择阻止特定零售商发送未来消息,从而有效创建黑名单。

对各状态

  1. DB值。当用于单个零售商retailerID客户寄存器被分配与零售商ID。
  2. 当用户注册的所有零售商retailerID的等于1
  3. 当顾客块零售商有两种选择:

    一个。如果他在isBlocked字段更新为1(true)之前注册到此特定零售商

    b。如果他注册的所有零售商都为这个零售商之前创建一个新的行和isBlocked设置为1(真)

挑战

当发送消息的SELECT查询应包括客户拥有的1 retailerID和已发送retailerIDisBlocked等于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