инвентарь php mysql - PullRequest
       10

инвентарь php mysql

1 голос
/ 07 октября 2011

Я создаю приложение для торговой карточной игры под названием 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;

Проблема с этим запросом заключается в том, что я могуНе используйте производное поле complete в предложении where, например:

WHERE completed > 0.5

Я не знаю, могут ли переменные решить эту проблему, я пробовал немного, но получилось заторможенное пюретак как я очень плохо знаком с пользовательскими переменными.

Редактировать: Некоторые хорошие люди ответили ниже, что мне нужен синтаксис HAVING, и это правильный и очевидный ответ.Тогда я бы просто выбрал лучший ответ на вопрос постскриптума.


Другое дело, если бы у меня было 200 000 колод в моей базе данных и у меня было 2000 карт в моем инвентаре, яхорошо с этим запросом, проходящим через все те и находящим, для каких колод у меня уже была половина карт.Но моя проблема с левым внешним присоединением.Я не знаю, как на самом деле работает MySQL внутри, но, возможно, кто-то, кто может это указать.При циклическом прохождении всех 200 000 колод он будет выполнять левое объединение для каждой существующей колоды или он будет достаточно умен, чтобы кэшировать его, чтобы он только один раз запрашивал мои предметы из инвентаря?

Заранее спасибо,

Рамон

1 Ответ

0 голосов
/ 07 октября 2011

Вы можете использовать HAVING completed > 0.5 для дальнейшего уменьшения количества возвращаемых строк.Вы можете прочитать больше о HAVING пункте в http://dev.mysql.com/doc/refman/5.5/en/select.html.

...