2013-10-26 57 views
-1

我有兩個表數據與多個條件

表:交易

id . user_id . amount . status 
1 - - 100 -- --- 500 - ----- 1 
2 - - 100 -- --- 100 - ----- 0 
3 - - 110 -- --- 200 - ----- 1 
4 - - 100 -- --- 220 - ----- 1 
5 - - 117 -- --- 120 - ----- 1 
6 - - 122 -- --- 300 - ----- 1 

這意味着由用戶存款但僅狀態= 1有效

表: 活動

id . user_id . bid . status . budget . expense . size. priority 
1 -- 100 ---- 80 --- 0 ------- 200 ------ 200 --- 5 -- 1 
2 -- 109 ---- 75 --- 1 ------- 050 ------ 030 --- 2 -- 2 
3 -- 100 ---- 65 --- 1 ------- 700 ------ 065 --- 2 -- 4 
4 -- 107 ---- 77 --- 0 ------- 020 ------ 020 --- 2 -- 3 
5 -- 90 ----- 87 --- 1 ------- 120 ------ 090 --- 7 -- 7 

我需要運動的id由下面的濾波後(使用PHP和MySQL)

條件:

01. campaign.status = 1 
02. campaign.size = 2 
03. campaign.budget > campaign.expense 

04. those user_id has balance (balance = A - B) 
     A = sum(transaction.amount where transaction.status=1) 
     B = sum(campaign.expense) 
05. order by bid max value 

預期輸出campaign.id = 3

for campaign.id 3 : status 1, size 2, budget 700 > expense 65 
balance > 0 means for user_id 100 = A(500+220) > B(200+65) //means A-B = 455 

我不那麼多專家。嘗試了幾種方法

請幫忙,解決後我會睡覺。失去2天。

+0

*什麼*不工作?你有錯誤信息嗎? –

+0

什麼是「資助」?我不明白你的條件 – Reeno

+0

據我理解你,這應該工作:SELECT \t campaign.id FROM \t活動 JOIN \t交易ON transaction.user_id = campaign.user_id WHERE \t campaign.status = 1 AND \t campaign.size = 2且 \t campaign.budget> campaign.expense AND \t SUM(transaction.amount)> SUM(campaign.expense) ORDER BY \t campaign.bid DESC – Reeno

回答

0

一個可能的解決方案:

SELECT * 
FROM campaign c 
WHERE 
    c.status = 1 
    AND c.size = 2 
    AND c.budget > c.expense 
    AND 
    (SELECT sum(amount) 
     FROM transaction t 
     WHERE t.user_id = c.user_id 
    ) 
    - 
    (SELECT sum(expense) 
     FROM campaign c1 
     WHERE c.user_id = c1.user_id AND t.status=1 
    ) 
    > 0 
; 

和另:

SELECT c.* 
FROM (
    SELECT user_id, sum(amount) amount 
    FROM transaction t 
    WHERE EXISTS(
     SELECT 1 FROM campaign c 
     WHERE t.user_id = c.user_id 
     AND c.status = 1 
     AND c.size = 2 
     AND c.budget > c.expense 
    ) 
    GROUP BY user_id 
) q1 
JOIN (
    SELECT user_id, sum(expense) expense 
    FROM campaign c 
    WHERE EXISTS(
     SELECT 1 FROM campaign c1 
     WHERE c.user_id = c1.user_id 
     AND c1.status = 1 
     AND c1.size = 2 
     AND c1.budget > c.expense 
    ) 
    GROUP BY user_id 
) q2 
ON q1.user_id = q2.user_id AND q1.amount - q2.expense > 0 
JOIN campaign c 
ON c.user_id = q1.user_id 
WHERE c.status = 1 
    AND c.size = 2 
    AND c.budget > c.expense 

(兩個查詢)演示:http://www.sqlfiddle.com/#!2/414ca5/2

請嘗試兩者上的數據,我不知道哪一個會表現更好(可能是第一個)。

兩個查詢需要在上user_id列兩個表,以獲得更好的性能指標最少:

CREATE INDEX camp_user_id ON campaign(user_id); 
CREATE INDEX trans_user_id ON transaction(user_id); 
+0

第一個與編輯工作。請看,我編輯了你的答案 –