0

应用目标

通过 GCM 从零售商向注册客户发送消息

数据库架构

我有一个customers表和一个相关customers_realtions表,其中包含以下字段:id, customerID, retailerID,isBlocked

要求的结果

客户可以注册特定零售商或通配符(所有这些)。

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

每个状态的 DB 值

  1. 当客户注册单个零售商retailerID时,会分配给零售商 ID。
  2. 当所有零售商的客户注册retailerID等于 1。
  3. 当客户阻止零售商时,有两种选择:

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

    湾。如果他在为此零售商创建新行之前向所有零售商注册并isBlocked设置为 1 (true)

挑战

发送消息时,SELECT 查询应包括零售商 ID 为 1 且在等于 1时发送消息的客户。retailerIDisBlocked

例如,在这种情况下

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 

问题

虽然这适用于我事先知道其 ID 的单个客户,但我正在努力寻找一种为多个客户编写类似查询的方法。

4

1 回答 1

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;
于 2013-08-03T19:50:33.223 回答