首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据另一行的值选择一行

根据另一行的值选择一行
EN

Stack Overflow用户
提问于 2013-08-03 19:45:00
回答 1查看 47关注 0票数 0

应用程序目标

通过GCM将零售商的信息发送给移动注册客户

DB体系结构

我有一个customers表和一个相关的customers_realtions表,其中包含以下字段:idcustomerIDretailerIDisBlocked

必需的结果

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

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

每个状态的DB值

  1. 当客户为单个零售商注册时,使用零售商ID分配retailerID
  2. 当所有零售商的客户注册时,retailerID等于1。
  3. 当顾客阻塞零售商时,有两种选择: 答:如果他在isBlocked字段被更新为1之前注册了这个特定的零售商(真) 如果他在为该零售商创建新行之前向所有零售商注册,并且isBlocked设置为1 (true)

挑战

在发送消息时,SELECT查询应该包括具有retailerID为1的客户,并且在isBlocked =1时没有发送retailerID

例如,在这种情况下

代码语言:javascript
复制
id  customerID  retailID    isBlocked
129 46          111                 1
128 46          1                   0

我不希望客户被选中,即使retailerID是111

我的尝试

代码语言:javascript
复制
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的单个客户工作的,但我很难找到一种为多个客户编写类似查询的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-03 19:50:33

我认为这是一个聚合查询。您希望查看未为客户阻塞的所有行,并确定零售商111是否可用或所有零售商可用:

代码语言:javascript
复制
SELECT customerId
FROM customers_relations cr
WHERE isBlocked = false
GROUP BY customerId
HAVING MAX(retailId = 111) > 0 OR
       MAX(retailId = 1) > 0;

我注意到,您的问题实际上是说,当有人被阻塞时,将在customer_relations中创建一个新行。以上假设只有一行。若要处理任何行上的块会导致块的情况,请执行以下操作:

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18036630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档