инвентаризация php mysql

#php #mysql #inventory-management

#php #mysql #управление инвентаризацией

Вопрос:

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

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

 WHERE completed > 0.5
  

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

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


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

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

Рамон

Комментарии:

1. Возможно, вы не сможете использовать WHERE completed > 0.5 , но пробовали ли вы HAVING completed > 0.5 ? Он появляется после GROUP BY и может использоваться для производных полей. dev.mysql.com/doc/refman/5.1/en/select.html

2. Спасибо, я должен был ввести это в качестве ответа, чтобы я мог выбрать его, поскольку он был первым перед Dvir.

3. Хе-хе — не думал, что это достаточно полно, чтобы быть полным ответом… а затем отвлекся, думая о том, как я построю для него всю систему баз данных, поскольку я, как известно, сам играл в MTG в прошлом 😉 Интересно, могу ли я нормализовать такие атрибуты, как «Первый удар», в другую таблицу или иметь один смехотворно длинный карточный стол…

4. На самом деле у меня есть вся система БД на месте, я просто ввожу набор карточек по набору, удаляя их из разных мест. В настоящее время все, что находится внутри поля правил, я сохраняю как есть. Я предполагаю, что слабость в том, что если бы были изменения текста правил, мне было бы трудно сделать это для всех из них, например, как «Не может быть целью» превратилось в «hexproof». Я был бы рад обсудить с вами больше, если хотите. Напишите мне по электронной почте или добавьте меня в Facebook: facebook.com/ramon.alivio

Ответ №1:

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