2014-05-13 3 views
0

У меня есть запрос MySQL, который вычисляет значения из таблицы. В моей программе мне нужно отобразить необработанные значения и процентное значение, например. «Вы использовали 1 из 100 (1%)». Насколько я знаю, было бы лучше использовать сервер базы данных для расчетов вместо бэкэнд (php в моем случае). Так что я пытался что-то вроде этогоMySQL получает значения и вычисляет процент с ними

SELECT SUM(used) AS totalUsed, MAX(quota) AS totalQuota, 100 * totalUsed/totalQuota AS percentUsed 

Но я получил ошибку, потому что база данных двигатель не может найти поля «totalUsed» и «totalQuota». Делая некоторые интернет-статьи, я узнал, что, похоже, невозможно использовать псевдоним позже в SELECT-Part, как переменная. Люди там рекомендуют использовать подзаголовок. Я не думаю, что подсекции не хороши, если их можно избежать. В моем случае я получаю данные из разных таблиц, и я использую JOINs, особенно, чтобы избежать подзапроса-запросов.

Я думаю, что я имею два варианта решения этой проблемы:

  1. Я делаю это классический путь, и пусть PHP вычислить процентное-значение в цикле
  2. Я снова использовать агрегатные функции в расчете, как это:

    SELECT SUM(used) AS totalUsed, MAX(quota) AS totalQuota, 100 * SUM(used)/MAX(quota) AS percentUsed I 
    

    Но здесь я не знаю, как MySQL работает на запросе: является ли MySQL достаточно умен, чтобы увидеть: SUM (используется) 2 раза в запросе, поэтому MySQL сделать расчет как для aggretate fun sUM и MAX только один раз, а во второй раз он использует переменную. Или mysql просто не заботится об этом и делает вычисления дважды? Я думаю, это важно, потому что если mysql умный и делает расчет только один раз, я думаю, что было бы лучше, если бы mysql выполнил эту работу. Но если нет, php будет более впечатляющим в моем оппионе.

ответ

0

Я думаю, что он вычисляет дважды.

Я попытался запустить следующее:

SELECT 
     SUM(used) AS totalUsed, 
     MAX(quota) AS totalQuota, 
     (100 * (SELECT totalUsed)/(SELECT totalQuota)) AS percentUsed 
FROM test123 

и он не работает, однако, если вы выполните следующее:

SELECT 
     20 AS totalUsed, 
     200 AS totalQuota, 
     (100 * (SELECT totalUsed)/(SELECT totalQuota)) AS percentUsed 
FROM test123 

Он будет работать, потому что числа 20 и 200 легко доступны.

Это только предположение с моей стороны. Подождите больше ответов.

Смежные вопросы