php mysql inventory


php mysql inventory

我正在为一款名为魔术:聚会的交易卡牌游戏创建一个应用程序,我已经进行了一个查询,检查所有用户提交的牌组,并向您提供库存中的卡与牌组中的卡的百分比。但我的问题是,它对数据库中的所有甲板都是这样做的。我想做的只是归还我已经有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.