2013-10-01 26 views
2

我有一个相当复杂的查询,因为我想保留的数学出的应用程序代码和查询。我试图在select中设置一个变量,然后在相同的select中重新使用它。不幸的是,我使用这些变量的任何一个列在应该有数据的地方返回null。其他一切工作正常。Mysql的使用变量选择

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 

在上面的查询中,subtotaltotal_including_taxes列返回null,我假设,因为查询无法访问先前定义的变量。

这是我第一次真正使用MySQL的用户变量(我是一个开发者,而不是一个DBA)和我不确定如果我做错事,如果是,如何解决它。如果需要的话,我可以在代码中进行数学运算,但我真的很想将它保留在数据库服务器上,因为它比应用程序服务器更加强大,并且可以更轻松地处理这些问题。

+0

不幸的是,前面的变量是未定义的。你可以用公式替代它们。或者在代码中计算(最佳选项)。 – user4035

+0

看起来你是对的。你可以发布这个答案,以便我可以接受吗? – Kevin

回答

0

鉴于你的查询,你正在做SUM(SUM(...))。 SUM的用于相加字段值,和我有点怀疑,变量会做同样的事情如:

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

可能也仅仅是

@bar := @bar + @foo 
+0

对不起,我粘贴了错误的查询版本。现在有正确的版本,我已经删除了那些额外的SUM(),但仍然在这些列中变为空。 – Kevin

+1

检查您要添加/修改的单个项目以使这些变量本身不为空。 sql'null'具有“传染性”,并且使其他任何其他参与'null'。它的字面意思是“未知的”,“已知的+未知的=未知的”。 –

+0

@Kevin如果@MarcB说的是你的情况,你可以用[IFNULL()](http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions)来处理null值。 html#function_ifnull),就像这样:'SUM(IFNULL(maybeNullColumn,0))'。这样你的查询将总结为'1 + 3 + 0 + 2 = 6'而不是'1 + 3 + NULL + 2 = NULL'。 – mathielo

0

不幸的是,在查询之前的变量未定义。你可以用公式替代它们。或者在代码中计算下一个变量。