2011-10-07 22 views
1

我正在創建一個名爲的魔術:收集的交易卡遊戲的應用程序,我已經提出了一個查詢,用於檢查所有用戶提交的套牌,併爲您提供庫存中卡的比例甲板上的牌。但我的問題是,它對數據庫上的所有套牌都是這樣。我想要做的只是返回我已經擁有50%牌的套牌。php mysql庫存

下面是該查詢:

SELECT 
SUM(t.qty_inv)/t.deck_cards completed, 
t.deck_id 
FROM (
    SELECT 
    CASE WHEN m.qty_inv IS NULL THEN 0 WHEN m.qty_inv > dc.card_qty THEN dc.card_qty ELSE m.qty_inv END qty_inv, 
    dc.deck_id, 
    d.deck_cards 
    FROM mtgb_test.decks d 
    INNER JOIN mtgb_test.decks_cards dc ON (d.deck_id = dc.deck_id) 
    LEFT OUTER JOIN (
    SELECT 
    COUNT(*) qty_inv, item_print_id print_id 
    FROM mtgb_test.inventories_items 
    WHERE item_user_id = 1 
    GROUP BY item_print_id 
) m ON (m.print_id = dc.card_print_id) 
) t 
GROUP BY deck_id 
ORDER BY completed DESC; 

與此查詢的問題是,我不能使用衍生完成領域的where子句中像這樣:

WHERE completed > 0.5 

我不不知道變量是否可以解決這個問題,我嘗試了一下,但是因爲我對用戶定義的變量很陌生,所以它被搗碎了。

編輯:一些好的人在下面回答我需要HAVING語法,這是正確和明顯的答案。那麼我可能會選擇後記問題的最佳答案。


另一件事,如果我有我的數據庫200000層甲板和我在庫存有2000卡,我沒事此查詢通過所有這些循環,並發現其甲板我已經卡片一半對於。但我的問題是與左外聯接。我不知道MySQL如何真正在裏面工作,但也許有人會指出。當循環遍歷所有200,000套牌時,它是否會爲每個套牌執行左連接,或者是否足夠智能來緩存這個數據,以便它只查詢我的庫存物品一次?

由於提前,

拉蒙

+1

您可能無法使用'WHERE completed> 0.5',但您是否嘗試過'HAVING completed> 0.5'?它出現在「GROUP BY」之後,可用於派生字段。 http://dev.mysql.com/doc/refman/5.1/en/select.html – CD001

+0

謝謝,應該已經輸入了這個答案,以便我可以在Dvir之前先選擇它。 – voldomazta

+0

嘿嘿 - 沒想到它已經足夠完整了,可以作爲一個完整的答案......然後分散思考如何爲它建立整個數據庫系統,因爲我以前就知道自己在玩MTG ;)想知道如果我將諸如「First Strike」之類的屬性標準化爲另一個表或者有一個可笑的過長卡表... – CD001

回答