我正在为一款名为魔术:聚会的交易卡牌游戏创建一个应用程序,我已经进行了一个查询,检查所有用户提交的牌组,并向您提供库存中的卡与牌组中的卡的百分比。但我的问题是,它对数据库中的所有甲板都是这样做的。我想做的只是归还我已经有50%的牌组。
以下是查询:
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在内部是如何工作的,但也许有人能指出这一点。当循环遍历所有200000个甲板时,它会对每个甲板进行左联接吗?还是它足够聪明,可以缓存它,这样它只查询我的库存物品一次?
提前感谢
Ramon
您可以使用HAVING completed > 0.5
来进一步减少返回的行数。有关HAVING
子句的详细信息,请访问http://dev.mysql.com/doc/refman/5.5/en/select.html.