Mysql 根据另一行的值选择一行
应用程序目标 通过GCM从零售商向注册客户发送信息 DB架构 我有一个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
customers
表和一个相关的customers\u realtions
表,其中包含以下字段:id
,customerID
,retailerID
,isBlocked
所需结果
客户可以注册特定零售商或通配符(全部)
如果一个人注册了所有零售商,他可以选择阻止特定零售商发送未来的信息,从而有效地创建一个黑名单
每个状态的DB值
retailerID
被分配零售商IDretailerID
等于1isBlocked
字段更新为1(true)之前注册到此特定零售商
b。如果他在为此零售商创建新行之前向所有零售商注册并且isBlocked
设置为1(true)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)。它明确表示,当零售商被阻止时,将创建一个新行。这就是我问这个问题的原因。我回答的第一个问题应该是正确的。