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

Mysql 根据另一行的值选择一行,mysql,database-design,relational-database,Mysql,Database Design,Relational Database,应用程序目标 通过GCM从零售商向注册客户发送信息 DB架构 我有一个customers表和一个相关的customers\u realtions表,其中包含以下字段:id,customerID,retailerID,isBlocked 所需结果 客户可以注册特定零售商或通配符(全部) 如果一个人注册了所有零售商,他可以选择阻止特定零售商发送未来的信息,从而有效地创建一个黑名单 每个状态的DB值 当客户为单个零售商注册时,retailerID被分配零售商ID 当客户为所有零售商注册时,retail

应用程序目标

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

DB架构

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

所需结果

客户可以注册特定零售商或通配符(全部)

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

每个状态的DB值

  • 当客户为单个零售商注册时,
    retailerID
    被分配零售商ID
  • 当客户为所有零售商注册时,
    retailerID
    等于1
  • 当客户阻止零售商时,有两种选择:

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

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

  • 挑战

    发送消息时,SELECT查询应包括retailerID为1且当
    isBlocked
    等于1时发送
    retailerID
    的客户

    例如,在这种情况下

    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的单个客户,但我很难找到一种为多个客户编写类似查询的方法

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

    SELECT customerId
    FROM customers_relations cr
    WHERE isBlocked = false
    GROUP BY customerId
    HAVING MAX(retailId = 111) > 0 OR
           MAX(retailId = 1) > 0;
    
    我注意到,您的问题实际上是说,当某人被阻止时,会在
    客户关系中创建一个新行。以上假设有一行。要处理任何行上的块将导致块的情况,请执行以下操作:

    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;
    

    如果用户多次阻止和取消阻止零售商,会发生什么情况?创建了多少行?显然,只有当用户之前没有注册到这个特定的零售商,即如果他注册了所有的零售商,才会创建该行。如果他确实注册了特定的零售商,
    的值被阻止
    只是相应地更新。请参阅系统工作原理说明中的步骤(3)。它明确表示,当零售商被阻止时,将创建一个新行。这就是我问这个问题的原因。我回答的第一个问题应该是正确的。