2013-10-01 3 views
2

У меня есть довольно привлекательный запрос, потому что я пытаюсь сохранить математику из кода приложения и в запросе. Я пытаюсь установить переменную в select, а затем повторно использовать ее в том же select. К сожалению, любой из моих столбцов, где я использую эти переменные, возвращает null, где должны быть данные. Все остальное работает нормально.Mysql using переменная в select

SELECT @signups:= COUNT(registrations.id) as signups, 
     @registrations:= SUM(IF(registrations.fees_paid_by_users = '1', registrations.amount - registrations.databar_fees - registrations.taxes - registrations.extras_price + registrations.discount_total, registrations.amount - registrations.taxes - registrations.extras_price + registrations.discount_total)) as registrations, 
     @activities:= SUM(registrations.extras_price) as activities, 
     @coupons:= SUM(discount_total) as coupons, 
     @subtotal:= @registrations + @activities - @coupons as subtotal, 
     @fees_not_paid_by_user:= SUM(IF(registrations.fees_paid_by_users = '0', registrations.databar_fees, 0)) as fees_not_paid_by_user, 
     @taxes:= SUM(registrations.taxes) as taxes, 
     @total_including_taxes:= @subtotal - @fees_not_paid_by_user + @taxes as total_including_taxes, 
     events.name, 
     event_forms.title , 
     event_forms.id, 
     CONCAT(users.first_name, ' ', users.last_name) as user_name 
FROM registrations, 
    events, 
    event_forms, 
    transactions, 
    users 
WHERE transactions.date >= '2013-09-01 00:00:00' 
AND transactions.date <= '2013-09-30 23:59:59' 
AND registrations.transaction_id = transactions.id 
AND registrations.event_forms_id = event_forms.id 
AND event_forms.event_id = events.id 
AND events.owner_id = users.id 
GROUP BY registrations.event_forms_id 
ORDER BY user_name ASC, name ASC, title ASC 

В приведенном выше запросе subtotal и total_including_taxes колонн возвращаются нулем, я предполагаю, потому что запрос не может получить доступ к ранее определенному переменным.

Это мой первый раз, когда я использую переменные пользователя MySQL (я разработчик, а не администратор базы данных), и я не уверен, что я что-то делаю неправильно, и если да, то как это исправить. Я могу сделать математику в коде, если мне это нужно, но мне бы очень хотелось сохранить ее на сервере базы данных, поскольку она намного лучше, чем сервер приложений, и может справиться с этим проще.

+0

К сожалению, предыдущие переменные не определены. И вам придется либо заменить формулы вместо них. Или вычислить в коде (лучший вариант). – user4035

+0

Похоже, ты прав. Можете ли вы опубликовать это как ответ, чтобы я мог его принять? – Kevin

ответ

0

Учитывая ваш запрос, вы делаете SUM (SUM (...)). СГМ предназначен для сложения значений полей, и я как бы сомневаюсь, что переменные будут делать то же самое, например.

SELECT .. 
    @foo := SUM(...), 
    @bar := SUM(@foo) 

мог бы также быть просто

@bar := @bar + @foo 
+0

Извините, я вставил неверную версию запроса. Правильная версия теперь есть, и я уже удалил эти дополнительные SUM(), но все равно получаю null в этих столбцах. – Kevin

+1

Убедитесь, что отдельные элементы, которые вы добавляете/подбиваете вместе, чтобы эти переменные сами не были пустыми. sql 'null' является« заразным »и делает все, что связано с ним в« null ». это буквально «неизвестно» и «известно + неизвестно = неизвестно». –

+0

@Kevin Если ваш @MarcB сказал, что это ваш случай, вы можете обрабатывать значения «null» с помощью [IFNULL()] (http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions. html # function_ifnull), вот так: 'SUM (IFNULL (возможно, NullColumn, 0))'. Таким образом, ваш запрос будет суммировать i .e '1 + 3 + 0 + 2 = 6' вместо' 1 + 3 + NULL + 2 = NULL'. – mathielo

0

К сожалению, предыдущие переменные в запросе, не определено. Вам придется либо заменить формулы вместо них. Или к следующим переменным вычислить в коде.