我有点纠结于如何在WHERE子句中使用SELECT查询中创建的变量,每当我试图使用它来过滤一些数据时,where子句都不知道我的变量是什么。下面是查询:
SELECT a.credit,
a.disDate,a.id, -t.price, at.tagID,
@first_month_days := DAY(LAST_DAY(a.disDate)) as firstMonthDays,
@first_month_day := DAY(a.disDate) as firstMonthDay,
@first := t.price/@first_month_days*(@first_month_days-@first_month_day) as firstMonthDayBill,
@second_month_days := DAY(last_day(date_add(a.disDate, interval @first_month_days-@first_month_day + 1 day))) as nextMonthDays,
@second := t.price/@second_month_days*(IF(40-(@first_month_days - @first_month_day) > @second_month_days,@second_month_days,40 - (@first_month_days - @first_month_day))) as secondMonthDayBill,
@third_month_days := DAY(last_day(date_add(a.disDate, interval @first_month_days-@first_month_day + @second_month_days + 1 day ))) as thirdMonthDays,
@third := IF(40 - (@first_month_days - @first_month_day) > @second_month_days,t.price/@third_month_days*(40 - ((@first_month_days-@first_month_day)+@second_month_days)),0) as thirdMonthDayBill,
a.balance,
@sum := @second+@first+@third
FROM ns_accounts a
INNER JOIN ns_tariffs t ON
a.tariffID = t.id
INNER JOIN ns_accounts_tags at ON
a.id = at.aID
AND at.tagID IN (13)
where a.credit is not null and a.disDate is not null and statusID = 1 and @sum > 0
我可以说得简单点:
SELECT
@first := DAY(LAST_DAY(a.number)),
@second := DAY(LAST_DAY(a.differentNumber))
@sum := @second+@first
FROM accounts a
where @sum > 0
在select查询中简单地创建一个变量,并且能够在where子句中使用它的最佳方法是什么?提前感谢您
1条答案
按热度按时间zdwk9cvp1#
在SQL中,不能在查询的选择列表中创建任何表达式,并在同一查询的WHERE子句中引用它。尽管选择列表表达式首先出现在查询语法中,但直到WHERE子句应用了行限制之后才计算它们。
这适用于用户定义的变量和别名。
解决方法是在子查询中计算表达式,然后在外部查询中引用它们。
在本例中,必须有两个级别的子查询。
sum
表达式不能在计算first
和second
表达式的同一个选择列表中引用这些表达式。同样,WHERE子句不能在计算表达式的同一查询中引用sum
。使用此解决方案,不需要用户定义的变量。不鼓励在SQL查询中使用用户定义的变量,因为选择列表中的表达式不能保证从左到右进行计算。