2013-08-03 93 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