我正在创建一个名为 Magic:the Gathering 的交易卡游戏的应用程序,我已经查询了所有用户提交的套牌,并为您提供了您的卡片百分比卡片中的卡片库存。但我的问题是,它为数据库中的所有套牌执行此操作。我想要做的只是返回已经拥有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语法,这是正确而明确的答案。我当时可能会选择对后记问题的最佳答案。
另一件事,如果我的数据库中有200,000个套牌,而且我的库存中有2,000张卡片,那么我可以通过这个查询循环查看所有这些卡片并找到我已经拥有一半卡片的卡片。但我的问题是LEFT OUTER JOIN。我不知道MySQL如何真正起作用,但也许有人可以指出它。当循环遍历所有200,000个套牌时,是否会对每个套牌执行左连接,或者它是否足够智能以缓存此类以便它只查询我的库存项目一次?
提前致谢,
Ramon的
答案 0 :(得分:0)
您可以使用HAVING completed > 0.5
进一步减少返回的行数。您可以在http://dev.mysql.com/doc/refman/5.5/en/select.html了解有关HAVING
条款的更多信息。